Ignore:
Timestamp:
Jun 18, 2010, 11:42:07 AM (14 years ago)
Author:
garnier
Message:

update geant4-09-04-beta-cand-01 interfaces-V09-03-09 vis-V09-03-08

Location:
trunk/source/processes/electromagnetic/standard
Files:
43 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/processes/electromagnetic/standard/History

    r1228 r1315  
    1 $Id: History,v 1.480 2009/12/03 17:28:28 vnivanch Exp $
     1$Id: History,v 1.504 2010/06/04 09:25:12 vnivanch Exp $
    22-------------------------------------------------------------------
    33
     
    1717     * Reverse chronological order (last date on top), please *
    1818     ----------------------------------------------------------
     19
     204 June 2010:  V.Ivant (emstand-V09-03-17)
     21- G4ICRU73QOModel - fixed problems and add factor for transition to
     22                    Bethe-Bloch at 2 MeV
     23- G4hIonisation - use G4ICRU73QOModel for negatively charged particles
     24                  below 2 MeV
     25- G4BraggModel - above 2 MeV use ICRU'49 parameterisation for all atoms
     26
     27June 3, 2010, V. Grichine
     28- G4PAIModel.cc, G4PAIPhotonModel.cc cout for the model initialisation
     29
     301 June 2010:  V.Ivant (emstand-V09-03-16)
     31- G4WentzelOKandVIxSection - optimized computation of the transport
     32                             cross section
     33- G4WentzelVIModel - optimized method of step limitation
     34
     3527 May 2010:  V.Ivant (emstand-V09-03-15)
     36- G4BraggIonGasModel, G4BetheBlochIonGasModel - new ionisation models
     37                      for low density media
     38- G4ICRU73QOModel (A.Bagulya) new model for anti-particles
     39- G4hIonisation - use G4ICRU73QOModel for anti-particles
     40- G4WentzelOKandVIxSection - new class to compute cross sections and
     41                             sample scattering angle 
     42- G4WentzelVIModel, G4eCoulombScatteringModel, G4CoulombScatteringModel
     43                    use new class G4WentzelOKandVIxSection
     44
     4520 May 2010:  V.Ivant (emstand-V09-03-14)
     46- G4UrbanMscModel93 - L.Urban removed randomisation of step limit for the
     47                      first step in any volume in the case of UseSafety
     48- Removed obsolete models: G4UrbanMscModel, G4UrbanMscModel2, G4UrbanMscModel71,
     49  G4MultipleScattering, G4ComptonScattering52, G4PolarizedComptonScattering
     50
     5117 May 2010:  V.Ivant (emstand-V09-03-13)
     52- G4WentzelVIModel, G4eCoulombScatteringModel - added momentum dependent
     53       limit of scattering angle between single and multiple scattering
     54       which allowing to use  G4WentzelVIModel with optical model
     55       of hadron scattering
     56
     5717 May 2010:  V.Ivant (emstand-V09-03-12)
     58- G4GoudsmitSaundersonMscModel, G4GoudsmitSaundersonTable (O.Kadri) -
     59       optimized code to improve speed by addition extra class members
     60
     6130 April 2010:  V.Ivant (emstand-V09-03-11)
     62- G4UrbanMscModel93 - L.Urban add randomisation of step limit for the
     63                      first step in any volume
     64
     6528 April 2010:  V.Ivant (emstand-V09-03-10)
     66G4eBremsstrahlungModel - fixed SelectRandomAtom method (bug report #1115)
     67
     6826 April 2010:  V.Ivant (emstand-V09-03-09)
     69- G4ASTARStopping, G4PSTARTStopping - C-arrays sustituted by G4PhysicsVector
     70            with spline; reviewed names of materials (G4_He, G4_PHOTO_EMULSION,
     71            G4_NYLON-6-6)
     72- G4ASTARStopping - fixed G4_O data
     73- G4PSTARStopping - fixed G4_Pt and G4_PROPANE data
     74- G4WaterStopping - cleanup GetElectronicDEDX method
     75
     7616 April 2010:  V.Ivant (emstand-V09-03-08)
     77- G4GoudsmitSaundersonMscModel (O.Kadri) - improved numerical stability
     78            of computations for small angles by  direct xsection calculation
     79            not inverse of the inverse angular sampling without large angle
     80            rejection method longitudinal displacement is computed exactly
     81            from <z>
     82- G4GoudsmitSaundersonTable (O.Kadri)    - improved numerical stability by
     83            minimum of used arrays in computation within the dichotomy
     84            finding method
     85- G4eMultipleScattering, G4hMultipleScattering - improved printout at
     86                                                 initialisation
     87
     8815 April 2010:  V.Ivant (emstand-V09-03-07)
     89- G4hMultipleScattering - removed old unused header of G4UrbanMscModel
     90- G4ASTARStopping.cc - disabled corrupted data for Oxygen
     91
     9206 April 2010:  V.Ivant (emstand-V09-03-06)
     93- G4eBremsstrahlungRelModel, G4MollerBhabhaModel - set minimum cut
     94                      value to 0.1 keV
     95
     9630 March 2010:  V.Ivant (emstand-V09-03-05)
     97- G4PolarizedComptonScattering - add message that this process is obsolete
     98
     9922 March 2010:  V.Ivant (emstand-V09-03-04)
     100- G4eBremsstrahlungModel - reduced minThreshold to 0.1 keV
     101- G4MollerBhabhaModel - reduced minimum cut value to mean ionisation
     102                      potential
     103
     10401 March 2010:  V.Ivant (emstand-V09-03-03)
     105- G4WentzelVIModel - added protections, added DefineMaterial() call
     106                     before computing cross section
     107
     10831 March 2010:  V.Ivant (emstand-V09-03-02a)
     109- G4PolarizedComptonScattering - add message that this process is obsolete
     110- G4eCoulombScatteringModel - returned method default value 100 eV of 9.3 for
     111                              internal low limit
     112
     11324 February 2010:  V.Ivant (emstand-V09-03-02)
     114- make a tag co-working with emutils-V09-03-02
     115
     11619 February 2010:  V.Ivant (emstand-V09-03-01)
     117- G4GoudsmitSaundersonMscModel, G4GoudsmitSaundersonTable (O.Kadri)
     118      - fixed problems of small angle theta distributions
     119
     12017 February 2010:  V.Ivant (emstand-V09-03-00)
     121- G4CoulombScatteringModel - Added comments to relativistic formula
     122- G4eCoulombScatteringModel - Added method SetLowEnergyLimit, default
     123                              value is set to 1 eV (before was 100 eV)
     124- G4CoulombScattering - Removed inclined method SetBuildTableFlag because
     125                        the method exist in the base class
    19126
    2012703 December 09:  V.Ivant (emstand-V09-02-36)
  • trunk/source/processes/electromagnetic/standard/include/G4ASTARStopping.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4ASTARStopping.hh,v 1.6 2008/11/13 12:04:37 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4ASTARStopping.hh,v 1.8 2010/04/26 17:22:08 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828
    2929#ifndef G4ASTARStopping_h
     
    5555
    5656#include "globals.hh"
     57#include "G4LPhysicsFreeVector.hh"
     58#include <vector>
    5759
    5860class G4Material;
     
    7678  void Initialise();
    7779
     80  void AddData(G4double* e, G4double* s, G4int idx);
     81
    7882  // hide assignment operator
    7983  G4ASTARStopping & operator=(const  G4ASTARStopping &right);
    8084  G4ASTARStopping(const  G4ASTARStopping&);
    8185
     86  G4int matIndex;
    8287  const G4Material* currentMaterial;
    83   G4int index, matIndex;
    84   G4String name[74];
    85   G4double currentE, res;
    86   G4double e[74][78], kinE[78];
    87   G4double effZ[74];
     88  G4double emin;
     89  std::vector<G4String> name;
     90  std::vector<G4double> effZ;
     91  std::vector<G4LPhysicsFreeVector*> sdata;
    8892};
    8993
     
    97101{
    98102  return effZ[idx];
    99 }
     103} 
    100104
    101105#endif
  • trunk/source/processes/electromagnetic/standard/include/G4BetheBlochModel.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4BetheBlochModel.hh,v 1.20 2009/04/23 17:44:43 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4BetheBlochModel.hh,v 1.23 2010/05/27 14:26:17 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    116116                                     G4double kineticEnergy);
    117117
    118   virtual void CorrectionsAlongStep(const G4MaterialCutsCouple*,
    119                                     const G4DynamicParticle*,
     118  virtual void CorrectionsAlongStep(const G4MaterialCutsCouple* couple,
     119                                    const G4DynamicParticle* dp,
    120120                                    G4double& eloss,
    121                                     G4double& niel,
     121                                    G4double&,
    122122                                    G4double length);
    123123
     
    133133                                      G4double kinEnergy);
    134134
     135  inline G4double GetChargeSquareRatio() const;
     136
     137  inline void SetChargeSquareRatio(G4double val);
     138
    135139private:
    136140
    137   inline void SetupParameters();
     141  void SetupParameters();
    138142
    139143  inline void SetParticle(const G4ParticleDefinition* p);
     
    169173//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    170174
    171 inline void G4BetheBlochModel::SetupParameters()
    172 {
    173   mass = particle->GetPDGMass();
    174   spin = particle->GetPDGSpin();
    175   G4double q = particle->GetPDGCharge()/eplus;
    176   chargeSquare = q*q;
    177   ratio = electron_mass_c2/mass;
    178   G4double magmom = particle->GetPDGMagneticMoment()*mass/(0.5*eplus*hbar_Planck*c_squared);
    179   magMoment2 = magmom*magmom - 1.0;
    180   formfact = 0.0;
    181   if(particle->GetLeptonNumber() == 0) {
    182     G4double x = 0.8426*GeV;
    183     if(spin == 0.0 && mass < GeV) {x = 0.736*GeV;}
    184     else if(mass > GeV) {
    185       x /= nist->GetZ13(mass/proton_mass_c2);
    186       //        tlimit = 51.2*GeV*A13[iz]*A13[iz];
    187     }
    188     formfact = 2.0*electron_mass_c2/(x*x);
    189     tlimit   = 2.0/formfact;
    190   }
    191 }
    192 
    193 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    194 
    195175inline void G4BetheBlochModel::SetParticle(const G4ParticleDefinition* p)
    196176{
    197177  if(particle != p) {
    198178    particle = p;
    199     if (p->GetPDGCharge()/eplus > 1.5 && p->GetBaryonNumber() > 2) isIon = true;
     179    if (p->GetPDGCharge()/eplus > 1.5 && p->GetBaryonNumber() > 2)
     180      { isIon = true; }
    200181    SetupParameters();
    201182  }
     
    206187inline void G4BetheBlochModel::SetGenericIon(const G4ParticleDefinition* p)
    207188{
    208   if(p && particle != p) {
    209     if(p->GetParticleName() == "GenericIon") isIon = true;
     189  if(p && particle != p) { 
     190    if(p->GetParticleName() == "GenericIon") { isIon = true; }
    210191  }
    211192}
    212193
     194//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     195
     196inline G4double G4BetheBlochModel::GetChargeSquareRatio() const
     197{
     198  return chargeSquare;
     199}
     200
     201//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     202
     203inline void G4BetheBlochModel::SetChargeSquareRatio(G4double val)
     204{
     205  chargeSquare = val;
     206}
     207
     208//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     209
    213210#endif
  • trunk/source/processes/electromagnetic/standard/include/G4BraggModel.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4BraggModel.hh,v 1.14 2009/11/10 19:25:47 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4BraggModel.hh,v 1.15 2010/05/27 10:08:58 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    121121                                     const G4Material* mat,
    122122                                     G4double kineticEnergy);
    123   /*
    124   // add correction to energy loss and compute non-ionizing energy loss
    125   virtual void CorrectionsAlongStep(const G4MaterialCutsCouple*,
    126                                     const G4DynamicParticle*,
    127                                     G4double& eloss,
    128                                     G4double& niel,
    129                                     G4double length);
    130   */
    131123
    132124protected:
     
    134126  virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
    135127                                      G4double kinEnergy);
     128
     129  inline G4double GetChargeSquareRatio() const;
     130
     131  inline void SetChargeSquareRatio(G4double val);
    136132
    137133private:
     
    197193}
    198194
     195inline G4double G4BraggModel::GetChargeSquareRatio() const
     196{
     197  return chargeSquare;
     198}
     199
     200inline void G4BraggModel::SetChargeSquareRatio(G4double val)
     201{
     202  chargeSquare = val;
     203}
     204
    199205//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    200206
  • trunk/source/processes/electromagnetic/standard/include/G4CoulombScattering.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4CoulombScattering.hh,v 1.13 2009/05/07 18:41:45 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4CoulombScattering.hh,v 1.14 2010/02/17 18:59:22 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    7373  // Set energy above which high energy model will be used
    7474  inline void SetHEModelLimit(G4double);
    75 
    76   // obsolete method to be removed
    77   inline void SetBuildTableFlag(G4bool);
    7875
    7976  // Print out of the class parameters
     
    125122//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    126123
    127 inline void G4CoulombScattering::SetBuildTableFlag(G4bool)
    128 {}
    129 
    130 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    131 
    132124inline void G4CoulombScattering::SetHEModelLimit(G4double val)
    133125{
  • trunk/source/processes/electromagnetic/standard/include/G4CoulombScatteringModel.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4CoulombScatteringModel.hh,v 1.15 2008/07/31 13:11:34 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4CoulombScatteringModel.hh,v 1.17 2010/05/27 14:22:05 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    4545// 09.10.07 V.Ivanchenko reorganized methods, add cut dependence in scattering off e-
    4646// 09.06.08 V.Ivanchenko SelectIsotope is moved to the base class
     47// 27.05.10 V.Ivanchenko added G4WentzelOKandVIxSection class to
     48//              compute cross sections and sample scattering angle
    4749//
    4850// Class Description:
  • trunk/source/processes/electromagnetic/standard/include/G4GoudsmitSaundersonMscModel.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4GoudsmitSaundersonMscModel.hh,v 1.2 2009/06/04 13:45:49 gunter Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4GoudsmitSaundersonMscModel.hh,v 1.4 2010/05/17 15:11:30 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    4141// Modifications:
    4242// 04.03.2009 V.Ivanchenko cleanup and format according to Geant4 EM style
     43// 12.05.2010 O.Kadri: adding Qn1 and Qn12 as private doubles
    4344//
    4445// Class description:
     
    5455//Ref.5:F. Salvat et al.,"ELSEPA--Dirac partial ...molecules", Comp. Phys. Comm. 165 (2005) pp 157-190;
    5556//Ref.6:G4UrbanMscModel G4_v9.1Ref09;
    56 //Ref.7:G4eCoulombScatteringModel G4_v9.1Ref09.
     57//Ref.7:G4WentzelVIModel G4_v9.3.
    5758//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    5859
     
    6364#include "G4PhysicsTable.hh"
    6465#include "globals.hh"
    65 #include "G4DataInterpolation.hh"
    6666
    6767class G4DataVector;
     
    114114  G4GoudsmitSaundersonMscModel(const  G4GoudsmitSaundersonMscModel&);
    115115
    116   G4double              lowKEnergy;
    117   G4double              highKEnergy;
     116  G4double lowKEnergy;
     117  G4double highKEnergy;
    118118  G4double currentKinEnergy;
    119119  G4double currentRange;
     
    125125  G4double charge,lambdalimit;
    126126  G4double tPathLength,stepmin ;
    127   G4double lambda1,lambda11;
     127  G4double lambda0,lambda1,lambda11,Qn1,Qn12;
    128128  G4double mass;
    129   G4double lambda0;
    130129  G4int    currentMaterialIndex;
    131130
     
    139138  const G4ParticleDefinition* particle;
    140139  G4ParticleChangeForMSC*     fParticleChange;
    141   G4DataInterpolation* MyValue;
    142140  const G4MaterialCutsCouple* currentCouple;
    143141
  • trunk/source/processes/electromagnetic/standard/include/G4GoudsmitSaundersonTable.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4GoudsmitSaundersonTable.hh,v 1.3 2009/06/18 18:43:09 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4GoudsmitSaundersonTable.hh,v 1.4 2010/02/19 09:29:53 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
  • trunk/source/processes/electromagnetic/standard/include/G4PSTARStopping.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4PSTARStopping.hh,v 1.5 2008/11/13 12:04:37 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4PSTARStopping.hh,v 1.7 2010/04/26 17:22:08 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828
    2929#ifndef G4PSTARStopping_h
     
    5656
    5757#include "globals.hh"
     58#include "G4LPhysicsFreeVector.hh"
     59#include <vector>
    5860
    5961class G4Material;
     
    7678  void Initialise();
    7779
     80  void AddData(G4double* e, G4double* s, G4int idx);
     81
    7882  // hide assignment operator
    7983  G4PSTARStopping & operator=(const  G4PSTARStopping &right);
    8084  G4PSTARStopping(const  G4PSTARStopping&);
    8185
     86  G4int matIndex;
    8287  const G4Material* currentMaterial;
    83   G4int index, matIndex;
    84   G4String name[74];
    85   G4double currentE, res;
    86   G4double e[74][60], kinE[60];
     88  G4double emin;
     89  std::vector<G4String> name;
     90  std::vector<G4LPhysicsFreeVector*> sdata;
    8791};
    8892
  • trunk/source/processes/electromagnetic/standard/include/G4UrbanMscModel93.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4UrbanMscModel93.hh,v 1.1 2009/11/01 13:04:12 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4UrbanMscModel93.hh,v 1.4 2009/12/14 06:57:12 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
  • trunk/source/processes/electromagnetic/standard/include/G4WaterStopping.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4WaterStopping.hh,v 1.7 2009/06/19 10:39:48 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4WaterStopping.hh,v 1.8 2010/04/26 17:22:08 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828
    2929#ifndef G4WaterStopping_h
     
    7979  G4int    Z[17];
    8080  G4double A[17];
     81  G4double emin;
    8182  std::vector<G4LPhysicsFreeVector*>  dedx;
    8283};
  • trunk/source/processes/electromagnetic/standard/include/G4WentzelVIModel.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4WentzelVIModel.hh,v 1.21 2009/10/10 15:16:57 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4WentzelVIModel.hh,v 1.29 2010/05/27 14:22:05 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    4040//
    4141// Modifications:
    42 //
     42// 27-05-2010 V.Ivanchenko added G4WentzelOKandVIxSection class to
     43//              compute cross sections and sample scattering angle
    4344//
    4445// Class Description:
     
    6061#include "G4VMscModel.hh"
    6162#include "G4PhysicsTable.hh"
    62 #include "G4MscStepLimitType.hh"
    6363#include "G4MaterialCutsCouple.hh"
    64 #include "G4NistManager.hh"
    65 
     64#include "G4WentzelOKandVIxSection.hh"
     65
     66class G4ParticleDefinition;
    6667class G4LossTableManager;
    67 class G4ParticleChangeForMSC;
    68 class G4ParticleDefinition;
     68class G4Pow;
    6969
    7070//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     
    100100private:
    101101
    102   G4double ComputeTransportXSectionPerAtom();
    103 
    104102  G4double ComputeXSectionPerVolume();
    105103
    106   void ComputeMaxElectronScattering(G4double cut);
    107 
    108104  inline G4double GetLambda(G4double kinEnergy);
    109105
    110106  inline void SetupParticle(const G4ParticleDefinition*);
    111 
    112   inline void SetupKinematic(G4double kinEnergy, G4double cut);
    113  
    114   inline void SetupTarget(G4double Z, G4double kinEnergy);
    115107
    116108  inline void DefineMaterial(const G4MaterialCutsCouple*);
     
    120112  G4WentzelVIModel(const  G4WentzelVIModel&);
    121113
    122   const G4ParticleDefinition* theProton;
    123   const G4ParticleDefinition* theElectron;
    124   const G4ParticleDefinition* thePositron;
    125 
     114  G4LossTableManager*       theManager;
    126115  G4ParticleChangeForMSC*   fParticleChange;
     116  G4WentzelOKandVIxSection* wokvi;
     117  G4Pow*                    fG4pow;
    127118
    128119  G4PhysicsTable*           theLambdaTable;
    129   G4PhysicsTable*           theLambda2Table;
    130   G4LossTableManager*       theManager;
    131120  const G4DataVector*       currentCuts;
    132121
    133   G4NistManager*            fNistManager;
    134 
    135   G4double numlimit;
    136122  G4double tlimitminfix;
    137123  G4double invsqrt12;
    138124
    139   // cash
     125  // cache kinematics
    140126  G4double preKinEnergy;
    141   G4double ecut;
    142   G4double lambda0;
    143127  G4double tPathLength;
    144128  G4double zPathLength;
    145129  G4double lambdaeff;
    146130  G4double currentRange;
    147   G4double par1;
    148   G4double par2;
    149   G4double par3;
    150 
     131
     132  // data for single scattering mode
    151133  G4double xtsec;
    152134  std::vector<G4double> xsecn;
     
    154136  G4int    nelments;
    155137
    156   G4int    nbins;
    157   G4int    nwarnings;
    158   G4int    nwarnlimit;
    159 
     138  G4double numlimit;
     139
     140  // cache material
    160141  G4int    currentMaterialIndex;
    161 
    162142  const G4MaterialCutsCouple* currentCouple;
    163143  const G4Material* currentMaterial;
    164144
    165145  // single scattering parameters
    166   G4double coeff;
    167146  G4double cosThetaMin;
    168147  G4double cosThetaMax;
    169148  G4double cosTetMaxNuc;
    170   G4double cosTetMaxNuc2;
    171   G4double cosTetMaxElec;
    172   G4double cosTetMaxElec2;
    173   G4double q2Limit;
    174   G4double alpha2;
    175149
    176150  // projectile
    177151  const G4ParticleDefinition* particle;
    178 
    179   G4double chargeSquare;
    180   G4double spin;
    181   G4double mass;
    182   G4double tkin;
    183   G4double mom2;
    184   G4double invbeta2;
    185   G4double kinFactor;
    186   G4double etag;
    187152  G4double lowEnergyLimit;
    188 
    189   // target
    190   G4double targetZ;
    191   G4double targetMass;
    192   G4double screenZ;
    193   G4double formfactA;
    194   G4int    iz;
    195 
    196   static G4double ScreenRSquare[100];
    197   static G4double FormFactor[100];
    198153
    199154  // flags
     
    222177  G4double x;
    223178  if(theLambdaTable) {
    224     G4bool b;
    225     x = ((*theLambdaTable)[currentMaterialIndex])->GetValue(e, b);
     179    x = ((*theLambdaTable)[currentMaterialIndex])->Value(e);
    226180  } else {
    227181    x = CrossSection(currentCouple,particle,e,
    228182                     (*currentCuts)[currentMaterialIndex]);
    229183  }
    230   if(x > DBL_MIN) x = 1./x;
    231   else            x = DBL_MAX;
     184  if(x > DBL_MIN) { x = 1./x; }
     185  else            { x = DBL_MAX; }
    232186  return x;
    233187}
     
    240194  if(p != particle) {
    241195    particle = p;
    242     mass = particle->GetPDGMass();
    243     spin = particle->GetPDGSpin();
    244     G4double q = particle->GetPDGCharge()/eplus;
    245     chargeSquare = q*q;
    246     tkin = 0.0;
     196    wokvi->SetupParticle(p);
    247197  }
    248198}
    249199
    250 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    251 
    252 inline void G4WentzelVIModel::SetupKinematic(G4double ekin, G4double cut)
    253 {
    254   if(ekin != tkin || ecut != cut) {
    255     tkin  = ekin;
    256     mom2  = tkin*(tkin + 2.0*mass);
    257     invbeta2 = 1.0 +  mass*mass/mom2;
    258     cosTetMaxNuc = cosThetaMax;
    259     if(mass < MeV && ekin <= 10.*cut) {
    260       cosTetMaxNuc = ekin*(cosThetaMax + 1.0)/(10.*cut) - 1.0;
    261     }
    262     ComputeMaxElectronScattering(cut);
    263   }
    264 }
    265 
    266 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    267  
    268 inline void G4WentzelVIModel::SetupTarget(G4double Z, G4double e)
    269 {
    270   if(Z != targetZ || e != etag) {
    271     etag    = e;
    272     targetZ = Z;
    273     iz = G4int(Z);
    274     if(iz > 99) iz = 99;
    275     targetMass = fNistManager->GetAtomicMassAmu(iz)*amu_c2;
    276     screenZ = ScreenRSquare[iz]/mom2;
    277     G4double meff = targetMass/(mass+targetMass);
    278     kinFactor = coeff*targetZ*chargeSquare*invbeta2/(mom2*meff*meff);
    279     screenZ *=(1.13 + std::min(1.0,3.76*Z*Z*invbeta2*alpha2));
    280     if(mass > MeV) { screenZ *= 2.0; }
    281     formfactA = FormFactor[iz]*mom2;
    282     cosTetMaxNuc2 = cosTetMaxNuc;
    283     cosTetMaxElec2 = cosTetMaxElec;
    284   }
    285 }
    286 
    287200//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    288201
  • trunk/source/processes/electromagnetic/standard/include/G4eCoulombScatteringModel.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4eCoulombScatteringModel.hh,v 1.49 2009/10/10 15:16:57 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4eCoulombScatteringModel.hh,v 1.56 2010/05/27 14:22:05 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    4747// 09.06.08 V.Ivanchenko add SelectIsotope and sampling of the recoil ion
    4848// 17.06.09 C.Consoalndi modified SetupTarget method - remove kinFactor
     49// 27.05.10 V.Ivanchenko added G4WentzelOKandVIxSection class to
     50//              compute cross sections and sample scattering angle
    4951//                                     
    5052//
     
    6668
    6769#include "G4VEmModel.hh"
    68 #include "G4PhysicsTable.hh"
    6970#include "globals.hh"
    70 #include "G4NistManager.hh"
    71 #include <vector>
     71#include "G4MaterialCutsCouple.hh"
     72#include "G4WentzelOKandVIxSection.hh"
    7273
    7374class G4ParticleChangeForGamma;
    7475class G4ParticleDefinition;
     76class G4ParticleTable;
     77class G4NistManager;
    7578
    7679class G4eCoulombScatteringModel : public G4VEmModel
     
    99102                                 G4double maxEnergy);
    100103
     104  // defines low energy limit of the model
     105  inline void SetLowEnergyLimit(G4double val);
     106
     107  // obsolete method
    101108  inline void SetRecoilThreshold(G4double eth);
    102109
    103110protected:
    104 
    105   G4double CrossSectionPerAtom();
    106 
    107   G4double SampleCosineTheta();
    108111
    109112  inline void DefineMaterial(const G4MaterialCutsCouple*);
     
    111114  inline void SetupParticle(const G4ParticleDefinition*);
    112115
    113   inline void SetupKinematic(G4double kinEnergy, G4double cut);
    114  
    115   inline void SetupTarget(G4double Z, G4double kinEnergy);
    116 
    117116private:
    118 
    119   void ComputeMaxElectronScattering(G4double cut);
    120117
    121118  // hide assignment operator
     
    125122protected:
    126123 
    127   const G4ParticleDefinition* theProton;
    128   const G4ParticleDefinition* theElectron;
    129   const G4ParticleDefinition* thePositron;
    130 
    131   G4ParticleTable*          theParticleTable;
     124  G4ParticleTable*          theParticleTable;
    132125  G4ParticleChangeForGamma* fParticleChange;
     126  G4WentzelOKandVIxSection* wokvi;
    133127  G4NistManager*            fNistManager;
    134128
     
    140134  G4int                       currentMaterialIndex;
    141135
    142   G4double                  coeff;
    143136  G4double                  cosThetaMin;
    144137  G4double                  cosThetaMax;
    145138  G4double                  cosTetMinNuc;
    146139  G4double                  cosTetMaxNuc;
    147   G4double                  cosTetMaxNuc2;
    148   G4double                  cosTetMaxElec;
    149   G4double                  cosTetMaxElec2;
    150   G4double                  q2Limit;
    151140  G4double                  recoilThreshold;
    152   G4double                  elecXSection;
    153   G4double                  nucXSection;
    154   G4double                  ecut;
     141  G4double                  elecRatio;
     142  G4double                  mass;
    155143
    156144  // projectile
    157145  const G4ParticleDefinition* particle;
     146  const G4ParticleDefinition* theProton;
    158147
    159   G4double                  chargeSquare;
    160   G4double                  spin;
    161   G4double                  mass;
    162   G4double                  tkin;
    163   G4double                  mom2;
    164   G4double                  invbeta2;
    165   G4double                  etag;
    166148  G4double                  lowEnergyLimit;
    167149
    168   // target
    169   G4double                  targetZ;
    170   G4double                  targetMass;
    171   G4double                  screenZ;
    172   G4double                  formfactA;
    173   G4int                     idxelm;
    174   G4int                     iz;
    175 
    176150private:
    177 
    178   G4double                  alpha2;
    179   G4double                  faclim;
    180 
    181   static G4double ScreenRSquare[100];
    182   static G4double FormFactor[100];
    183151
    184152  G4bool                    isInitialised;             
     
    206174    particle = p;
    207175    mass = particle->GetPDGMass();
    208     spin = particle->GetPDGSpin();
    209     G4double q = particle->GetPDGCharge()/eplus;
    210     chargeSquare = q*q;
    211     tkin = 0.0;
     176    wokvi->SetupParticle(p);
    212177  }
    213178}
     
    215180//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    216181
    217 inline void G4eCoulombScatteringModel::SetupKinematic(G4double ekin,
    218                                                       G4double cut)
     182inline void G4eCoulombScatteringModel::SetLowEnergyLimit(G4double val)
    219183{
    220   if(ekin != tkin || ecut != cut) {
    221     tkin = ekin;
    222     mom2 = tkin*(tkin + 2.0*mass);
    223     invbeta2 = 1.0 +  mass*mass/mom2;
    224     cosTetMinNuc = cosThetaMin;
    225     cosTetMaxNuc = cosThetaMax;
    226     if(mass < MeV && cosThetaMin < 1.0 && ekin <= 10.*cut) {
    227       cosTetMinNuc = ekin*(cosThetaMin + 1.0)/(10.*cut) - 1.0;
    228     }
    229     ComputeMaxElectronScattering(cut);
    230   }
     184  lowEnergyLimit = val;
    231185}
    232 
    233 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    234  
    235 inline void G4eCoulombScatteringModel::SetupTarget(G4double Z, G4double e)
    236 {
    237   if(Z != targetZ || e != etag) {
    238     etag    = e;
    239     targetZ = Z;
    240     iz= G4int(Z);
    241     if(iz > 99) iz = 99;
    242     targetMass = fNistManager->GetAtomicMassAmu(iz)*amu_c2;
    243     screenZ = ScreenRSquare[iz]/mom2;
    244     screenZ *=(1.13 + std::min(1.0,3.76*Z*Z*invbeta2*alpha2));
    245     if(mass > MeV) { screenZ *= 2.0; }
    246     formfactA = FormFactor[iz]*mom2;
    247     cosTetMaxNuc2 = cosTetMaxNuc;
    248     if(1 == iz && particle == theProton && cosTetMaxNuc2 < 0.0) {
    249       cosTetMaxNuc2 = 0.0;
    250     }
    251     cosTetMaxElec2 = cosTetMaxElec;
    252   }
    253 }
    254186
    255187//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
  • trunk/source/processes/electromagnetic/standard/include/G4hIonisation.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4hIonisation.hh,v 1.42 2009/02/20 12:06:37 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4hIonisation.hh,v 1.44 2010/05/27 10:25:23 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    101101  virtual void PrintInfo();
    102102
     103  // obsolete method
    103104  void ActivateNuclearStopping(G4bool);
    104105
     
    115116
    116117  G4bool     isInitialised;
    117   G4bool     nuclearStopping;
    118118
    119119  G4double   mass;
     
    124124//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    125125
    126 inline void G4hIonisation::ActivateNuclearStopping(G4bool val)
    127 {
    128   nuclearStopping = val;
    129 }
    130 
    131 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    132 
    133126#endif
  • trunk/source/processes/electromagnetic/standard/src/G4ASTARStopping.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4ASTARStopping.cc,v 1.8 2008/11/24 18:28:09 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
    28 
     26// $Id: G4ASTARStopping.cc,v 1.13 2010/04/26 17:22:08 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
     28//
    2929//---------------------------------------------------------------------------
    3030//
     
    4040//
    4141// Modifications:
     42// 19.04.2010 A.Ivanchenko fixed data for G4_O,
     43//                         checked all data
     44// 25.04.2010 V.Ivanchenko introduce G4LPhysicsFreeVector
    4245//
    4346//----------------------------------------------------------------------------
     
    5356G4ASTARStopping::G4ASTARStopping()
    5457{
    55   currentE = 0.0;
    5658  currentMaterial = 0;
    57   index = 0;
    5859  matIndex = -1;
     60
     61  name.resize(74,"");
     62  effZ.resize(74,0);
     63  sdata.resize(74,0);
     64
    5965  Initialise();
    6066}
     
    6369
    6470G4ASTARStopping::~G4ASTARStopping()
    65 {}
     71{
     72  for(size_t i=0; i<74; ++i) { delete sdata[i]; }
     73}
    6674
    6775//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     
    6977G4int G4ASTARStopping:: GetIndex (const G4Material* mat)
    7078
    71   if (mat == currentMaterial) return matIndex;
     79  if (mat == currentMaterial) { return matIndex; }
    7280  G4String matName = mat->GetName();
    73   for (G4int i=0; i<74; i++){
    74     if (matName == name[i]){
     81  for (G4int i=0; i<74; ++i){
     82    if (matName == name[i]){ 
    7583      matIndex = i;
    7684      currentMaterial = mat;
     
    8593G4double G4ASTARStopping::GetElectronicDEDX(G4int i, G4double energy)
    8694{
    87   if (matIndex == i && energy == currentE) return res;       
    88 
     95  G4double res = 0.0;
    8996  if (i<0 || i>73){
    9097    G4cout << "### G4ASTARStopping WARNING: index "
    9198           << i << " is out of range!" << G4endl;
    92     res = 0.0;
    9399    return res;
    94100  }
    95   matIndex = i;
    96   currentE = energy;
    97 
    98   if (energy < kinE[index] || energy > kinE[index+1]){
    99 
    100     if (energy <= kinE[0]) {
    101       index = 0;
    102       res = e[matIndex][0]*std::sqrt(energy/kinE[0]);
    103       return res;
    104     } else if (energy >= kinE[77]) {
    105       index = 76;
    106       res = e[matIndex][77];
    107       return res;
    108     }
    109     for (index = 0; index<77; index++){if (energy <= kinE[index+1]) break;}
    110   }
    111 
    112   G4double t1 = kinE[index];
    113   G4double t2 = kinE[index+1];
    114   G4double e1 = e[matIndex][index];
    115   G4double e2 = e[matIndex][index+1];
    116   res = e1*std::exp(std::log(energy/t1)*std::log(e2/e1)/std::log(t2/t1));
     101  if(energy < emin) { res = (*(sdata[i]))[0]*std::sqrt(energy/emin); }
     102  else              { res = sdata[i]->Value(energy); }
    117103  return res;
    118  }
     104}
    119105 
    120106void G4ASTARStopping::Initialise()
    121107{
    122 
    123 G4int i;
    124108G4double Z[74] = {
    125109  6.0,  6.0,  6.0, 47.0,  7.0, 13.0, 13.0, 18.0, 79.0, 6.0,
     
    133117};
    134118
    135  for(i=0; i<74; i++) {effZ[i]=Z[i];}
    136  
     119for(G4int i=0; i<74; ++i) {effZ[i]=Z[i];}
     120  
    137121name [0] = "G4_A-150_TISSUE"; 
    138 G4double T0[78] = { 0.001, 0.0015, 0.002, 0.0025, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01, 0.0125, 0.015, 0.0175, 0.02, 0.0225, 0.025, 0.0275, 0.03, 0.035, 0.04, 0.045, 0.05, 0.055, 0.06, 0.065, 0.07, 0.075, 0.08, 0.085, 0.09, 0.095, 0.1, 0.125, 0.15, 0.175, 0.2, 0.225, 0.25, 0.275, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10 };
    139  
     122G4double T0[78] = { 0.001, 0.0015, 0.002, 0.0025, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01, 0.0125, 0.015, 0.0175, 0.02, 0.0225, 0.025, 0.0275, 0.03, 0.035, 0.04, 0.045, 0.05, 0.055, 0.06, 0.065, 0.07, 0.075, 0.08, 0.085, 0.09, 0.095, 0.1, 0.125, 0.15, 0.175, 0.2, 0.225, 0.25, 0.275, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10. };
     123 emin = T0[0]*MeV;
     124
    140125G4double e0[78] = { 168.8, 204.2, 233.8, 259.7, 283, 324.3, 360.4, 393, 422.8, 450.5, 476.5, 501, 557.1, 607.7, 654.1, 697.1, 737.4, 775.4, 811.5, 845.9, 910.3, 970, 1026, 1078, 1128, 1175, 1220, 1263, 1305, 1344, 1383, 1419, 1455, 1489, 1646, 1782, 1901, 2005, 2097, 2178, 2249, 2312, 2413, 2488, 2539, 2572, 2589, 2593, 2586, 2571, 2548, 2521, 2489, 2453, 2416, 2377, 2176, 1989, 1825, 1683, 1561, 1457, 1369, 1292, 1165, 1062, 978.5, 908.4, 848.8, 797.4, 752.4, 712.9, 677.7, 646.1, 617.7, 591.9, 568.4, 547 };
    141  
    142  for(i=0; i<78; i++) {e[0][i]=e0[i]*MeV*cm2/g;}
    143  for(i=0; i<78; i++) {kinE[i]=T0[i];}
     126AddData(T0,e0, 0);
    144127 
    145128name [1] = "G4_ACETYLENE";
    146129G4double e1[78] = { 192.2, 229.4, 260.2, 287, 311, 353.1, 389.7, 422.5, 452.4, 480.1, 506, 530.3, 585.9, 635.7, 681.2, 723.2, 762.5, 799.4, 834.3, 867.5, 929.6, 986.9, 1040, 1090, 1137, 1182, 1224, 1265, 1304, 1341, 1376, 1411, 1444, 1475, 1619, 1741, 1847, 1938, 2017, 2085, 2144, 2195, 2275, 2331, 2367, 2388, 2397, 2395, 2386, 2370, 2350, 2326, 2299, 2271, 2241, 2210, 2056, 1913, 1783, 1666, 1562, 1468, 1384, 1308, 1177, 1072, 986.8, 915.5, 855, 802.8, 757.2, 717.1, 681.4, 649.5, 620.7, 594.7, 570.9, 549.2 };
    147  
    148  for(i=0; i<78; i++) {e[1][i]=e1[i]*MeV*cm2/g;}
     130AddData(T0,e1, 1);
    149131 
    150132name [2] = "G4_ADIPOSE_TISSUE_ICRP";
    151133G4double e2[78] = { 169.4, 204.2, 233.3, 258.8, 281.8, 322.4, 358.1, 390.2, 419.7, 447.2, 472.9, 497.2, 552.9, 603.2, 649.4, 692.4, 732.7, 770.7, 806.8, 841.3, 906, 966.1, 1022, 1075, 1125, 1173, 1219, 1262, 1304, 1344, 1383, 1420, 1456, 1491, 1650, 1787, 1907, 2012, 2104, 2185, 2256, 2317, 2417, 2489, 2539, 2571, 2588, 2592, 2587, 2573, 2554, 2529, 2500, 2468, 2434, 2398, 2213, 2035, 1874, 1731, 1605, 1499, 1408, 1328, 1197, 1091, 1004, 932.2, 870.7, 817.8, 771.5, 730.8, 694.5, 662.1, 632.9, 606.4, 582.3, 560.2 };
    152  
    153  for(i=0; i<78; i++) {e[2][i]=e2[i]*MeV*cm2/g;}
     134AddData(T0,e2, 2);
    154135 
    155136name [3] = "G4_Ag";
    156137G4double e3[78] = { 31.26, 38.13, 43.91, 48.98, 53.56, 61.66, 68.79, 75.21, 81.11, 86.6, 91.74, 96.6, 107.7, 117.8, 127, 135.6, 143.6, 151.2, 158.4, 165.3, 178.2, 190.2, 201.4, 212, 222, 231.6, 240.7, 249.5, 257.9, 266, 273.9, 281.4, 288.8, 295.9, 328.8, 357.8, 383.8, 407.4, 428.8, 448.4, 466.3, 482.8, 511.8, 536.2, 556.6, 573.5, 587.3, 598.4, 607.2, 613.8, 618.5, 621.6, 623.4, 623.8, 623.3, 621.8, 604.4, 578.7, 550.8, 523.3, 497.6, 474.4, 453.6, 435, 402.7, 375.9, 353.2, 333.6, 316.9, 302, 288.8, 276.9, 266.2, 256.5, 247.7, 239.5, 232, 225.1 };
    157  
    158  for(i=0; i<78; i++) {e[3][i]=e3[i]*MeV*cm2/g;}
     138AddData(T0,e3, 3);
    159139 
    160140name [4] = "G4_AIR";
    161141G4double e4[78] = { 87.5, 108.6, 126.7, 142.7, 157.3, 183.5, 206.7, 227.9, 247.5, 265.9, 283.2, 299.6, 337.7, 372.3, 404.3, 434.3, 462.6, 489.4, 515, 539.5, 585.8, 629, 669.6, 708.1, 744.8, 779.8, 813.4, 845.7, 876.8, 906.8, 935.9, 964, 991.3, 1018, 1140, 1247, 1343, 1429, 1506, 1575, 1637, 1693, 1787, 1861, 1918, 1961, 1990, 2008, 2017, 2019, 2013, 2002, 1987, 1968, 1946, 1922, 1774, 1625, 1494, 1382, 1287, 1205, 1133, 1072, 968.6, 885.9, 818, 760.7, 711.7, 669.6, 632.7, 600.2, 571.2, 545.3, 521.9, 500.6, 481.2, 463.4 };
    162  
    163  for(i=0; i<78; i++) {e[4][i]=e4[i]*MeV*cm2/g;}
     142AddData(T0,e4, 4);
    164143 
    165144name [5] = "G4_Al";
    166145G4double e5[78] = { 55.8, 71.89, 86.05, 98.92, 110.9, 132.7, 152.5, 170.9, 188.2, 204.5, 220.1, 235.1, 270.1, 302.5, 332.8, 361.5, 388.6, 414.6, 439.4, 463.3, 508.4, 550.4, 589.6, 626.5, 661.1, 693.7, 724.3, 753.2, 780.3, 805.9, 830.1, 852.8, 874.3, 894.5, 980, 1045, 1096, 1136, 1168, 1195, 1216, 1234, 1262, 1280, 1291, 1297, 1298, 1297, 1293, 1286, 1279, 1269, 1259, 1248, 1237, 1225, 1161, 1098, 1039, 984.9, 937.6, 895.4, 856.8, 821, 756.1, 698.6, 647.8, 604.8, 567.8, 535.7, 507.4, 482.4, 460, 439.8, 421.6, 405.1, 389.9, 376 };
    167  
    168  for(i=0; i<78; i++) {e[5][i]=e5[i]*MeV*cm2/g;}
     146AddData(T0,e5, 5);
    169147 
    170148name [6] = "G4_ALUMINUM_OXIDE";
    171149G4double e6[78] = { 71.39, 88.59, 103.3, 116.4, 128.4, 149.9, 169, 186.5, 202.8, 218, 232.3, 246, 277.7, 306.6, 333.4, 358.5, 382.1, 404.6, 426, 446.5, 485, 520.9, 554.3, 585.8, 615.5, 643.5, 670, 695.2, 719.1, 741.9, 763.6, 784.3, 804, 822.9, 905.9, 974, 1031, 1080, 1122, 1159, 1191, 1220, 1267, 1304, 1332, 1353, 1368, 1378, 1383, 1385, 1384, 1381, 1376, 1370, 1362, 1352, 1308, 1253, 1187, 1115, 1044, 982.5, 928.4, 880, 801.2, 737, 683.4, 638.1, 599.1, 565.2, 535.4, 508.9, 485.3, 464, 444.8, 427.3, 411.4, 396.7 };
    172  
    173  for(i=0; i<78; i++) {e[6][i]=e6[i]*MeV*cm2/g;}
     150AddData(T0,e6, 6);
    174151 
    175152name [7] = "G4_Ar";
    176153G4double e7[78] = { 34.54, 44.56, 53.39, 61.42, 68.88, 82.53, 94.95, 106.5, 117.3, 127.6, 137.4, 146.8, 168.8, 189.3, 208.5, 226.7, 244.1, 260.8, 276.8, 292.3, 321.9, 349.8, 376.5, 401.9, 426.4, 450, 472.8, 494.9, 516.3, 537.1, 557.3, 577, 596.1, 614.8, 702.1, 780.3, 850.8, 914.4, 971.9, 1024, 1070, 1111, 1181, 1233, 1272, 1298, 1314, 1321, 1321, 1315, 1305, 1291, 1276, 1258, 1240, 1222, 1130, 1047, 974, 911.2, 856.7, 809, 767, 729.8, 666.1, 613.2, 569.7, 532.7, 501, 473.4, 449.1, 427.4, 408.3, 391, 375.4, 361.1, 348.1, 336 };
    177  
    178  for(i=0; i<78; i++) {e[7][i]=e7[i]*MeV*cm2/g;}
     154AddData(T0,e7, 7);
    179155 
    180156name [8] = "G4_Au";
    181157G4double e8[78] = { 11.5, 14.55, 17.2, 19.57, 21.76, 25.72, 29.27, 32.54, 35.59, 38.46, 41.18, 43.78, 49.83, 55.39, 60.56, 65.44, 70.06, 74.46, 78.68, 82.74, 90.45, 97.69, 104.5, 111.1, 117.3, 123.3, 129.1, 134.6, 140, 145.2, 150.3, 155.2, 160, 164.7, 186.4, 205.8, 223.5, 239.5, 254.2, 267.7, 280.1, 291.5, 311.6, 328.5, 342.6, 354.3, 363.8, 371.5, 377.5, 382.1, 385.5, 387.8, 389.1, 389.6, 389.4, 388.7, 384.4, 375.7, 362.6, 346.8, 330.5, 316.4, 304, 293, 274.1, 258.4, 245, 233.4, 223.1, 214, 205.8, 198.4, 191.6, 185.5, 179.7, 174.5, 169.6, 165 };
    182  
    183  for(i=0; i<78; i++) {e[8][i]=e8[i]*MeV*cm2/g;}
     158AddData(T0,e8, 8);
    184159 
    185160name [9] = "G4_B-100_BONE";
    186161G4double e9[78] = { 138.6, 167.7, 192, 213.3, 232.4, 266.3, 296, 322.7, 347.2, 369.9, 391.2, 411.3, 457.3, 498.8, 536.8, 572, 605, 636.1, 665.7, 693.8, 746.5, 795.4, 841, 883.9, 924.5, 963.1, 999.9, 1035, 1069, 1101, 1133, 1163, 1192, 1220, 1348, 1460, 1557, 1643, 1719, 1786, 1845, 1897, 1983, 2047, 2093, 2124, 2142, 2149, 2148, 2139, 2125, 2106, 2084, 2059, 2031, 2003, 1861, 1726, 1600, 1484, 1379, 1290, 1214, 1147, 1035, 945.3, 871.8, 810, 757.7, 712.5, 672.9, 638.1, 607, 579.2, 554.1, 531.3, 510.5, 491.5 };
    187  
    188  for(i=0; i<78; i++) {e[9][i]=e9[i]*MeV*cm2/g;}
     162AddData(T0,e9, 9);
    189163 
    190164name [10] = "G4_Be";
    191165G4double e10[78] = { 146.3, 177.1, 202.9, 225.4, 245.6, 281.3, 312.5, 340.6, 366.2, 390, 412.2, 433.2, 481.1, 524.1, 563.3, 599.7, 633.6, 665.4, 695.6, 724.2, 777.7, 827, 872.7, 915.5, 955.7, 993.7, 1030, 1064, 1096, 1128, 1157, 1186, 1213, 1239, 1356, 1453, 1534, 1602, 1659, 1706, 1745, 1776, 1821, 1846, 1856, 1855, 1845, 1829, 1809, 1785, 1759, 1732, 1703, 1674, 1645, 1617, 1499, 1406, 1326, 1254, 1189, 1129, 1075, 1024, 935.3, 858.7, 792.9, 737.6, 690, 648.7, 612.5, 580.4, 552, 526.4, 503.3, 482.4, 463.3, 445.8 };
    192  
    193  for(i=0; i<78; i++) {e[10][i]=e10[i]*MeV*cm2/g;}
     166AddData(T0,e10, 10);
    194167 
    195168name [11] = "G4_BONE_COMPACT_ICRU";
    196169G4double e11[78] = { 125.9, 152.6, 175, 194.8, 212.5, 244.1, 271.8, 296.8, 319.8, 341.1, 361.2, 380.2, 423.8, 463.1, 499.3, 533, 564.6, 594.5, 622.8, 649.9, 700.8, 748.1, 792.4, 834.2, 873.7, 911.4, 947.4, 981.9, 1015, 1047, 1078, 1107, 1136, 1164, 1291, 1401, 1498, 1584, 1660, 1727, 1787, 1839, 1926, 1991, 2039, 2072, 2092, 2103, 2105, 2100, 2089, 2075, 2056, 2035, 2011, 1986, 1846, 1705, 1576, 1460, 1358, 1271, 1196, 1130, 1020, 931.6, 859.4, 798.8, 747.4, 702.9, 664, 629.7, 599.1, 571.7, 547.1, 524.7, 504.3, 485.6 };
    197  
    198  for(i=0; i<78; i++) {e[11][i]=e11[i]*MeV*cm2/g;}
     170AddData(T0,e11, 11);
    199171 
    200172name [12] = "G4_C";
    201173G4double e12[78] = { 190.6, 225.6, 254.3, 279, 300.9, 339.2, 372.1, 401.4, 427.9, 452.3, 475, 496.2, 544.3, 586.9, 625.5, 661, 693.8, 724.6, 753.5, 780.8, 831.5, 877.9, 920.8, 960.6, 998, 1033, 1066, 1098, 1128, 1156, 1184, 1210, 1235, 1259, 1366, 1455, 1531, 1595, 1650, 1698, 1738, 1772, 1825, 1862, 1886, 1900, 1906, 1906, 1901, 1892, 1880, 1866, 1850, 1833, 1814, 1795, 1684, 1571, 1466, 1372, 1288, 1213, 1145, 1085, 981.9, 898.2, 829.6, 772, 722.9, 680.4, 643.1, 610.2, 580.8, 554.4, 530.6, 509, 489.2, 471.2 };
    202  
    203  for(i=0; i<78; i++) {e[12][i]=e12[i]*MeV*cm2/g;}
    204  
    205 name [13] = "G4_C_Graphite";
     174AddData(T0,e12, 12);
     175 
     176name [13] = "G4_GRAPHITE_POROUS";
    206177G4double e13[78] = { 192.3, 228.9, 259, 285.1, 308.3, 348.9, 384, 415.3, 443.7, 469.9, 494.2, 517, 568.9, 615.1, 657, 695.5, 731.3, 764.8, 796.3, 826.2, 881.8, 932.7, 979.8, 1024, 1065, 1104, 1141, 1175, 1209, 1240, 1271, 1300, 1327, 1354, 1473, 1574, 1658, 1731, 1793, 1845, 1890, 1929, 1987, 2027, 2051, 2063, 2065, 2060, 2049, 2034, 2015, 1993, 1969, 1944, 1917, 1891, 1751, 1620, 1502, 1400, 1310, 1231, 1161, 1099, 994.3, 909, 839.2, 780.7, 730.8, 687.6, 649.8, 616.4, 586.6, 559.8, 535.7, 513.8, 493.8, 475.5 };
    207  
    208  for(i=0; i<78; i++) {e[13][i]=e13[i]*MeV*cm2/g;}
     178AddData(T0,e13, 13);
    209179 
    210180name [14] = "G4_ETHYLENE";
    211181G4double e14[78] = { 159.8, 195.8, 226, 252.7, 276.8, 319.7, 357.4, 391.5, 422.9, 452.1, 479.5, 505.4, 565.1, 619, 668.6, 714.8, 758.1, 799.1, 838.1, 875.3, 945.4, 1011, 1072, 1130, 1185, 1237, 1288, 1336, 1383, 1428, 1471, 1514, 1555, 1594, 1779, 1945, 2094, 2230, 2354, 2468, 2571, 2666, 2830, 2961, 3060, 3130, 3172, 3189, 3185, 3164, 3129, 3086, 3038, 2986, 2931, 2876, 2578, 2306, 2084, 1907, 1763, 1642, 1539, 1450, 1303, 1185, 1089, 1010, 941.9, 883.6, 832.8, 788.1, 748.4, 712.9, 680.9, 652, 625.7, 601.7 };
    212  
    213  for(i=0; i<78; i++) {e[14][i]=e14[i]*MeV*cm2/g;}
     182AddData(T0,e14, 14);
    214183 
    215184name [15] = "G4_C-552";
    216185G4double e15[78] = { 124.1, 148.8, 169.3, 187.2, 203.3, 231.5, 256.1, 278.2, 298.4, 317.1, 334.5, 351, 388.6, 422.4, 453.2, 481.8, 508.4, 533.5, 557.3, 579.9, 622.2, 661.3, 697.8, 732, 764.3, 794.9, 824, 851.9, 878.5, 904.1, 928.7, 952.4, 975.2, 997.3, 1097, 1184, 1259, 1325, 1384, 1435, 1481, 1521, 1588, 1639, 1678, 1706, 1726, 1738, 1744, 1745, 1743, 1736, 1727, 1716, 1703, 1688, 1603, 1511, 1421, 1338, 1261, 1190, 1126, 1067, 965.5, 883.8, 816.4, 759.6, 711.1, 669.1, 632.3, 599.9, 571, 545, 521.6, 500.3, 480.9, 463.1 };
    217  
    218  for(i=0; i<78; i++) {e[15][i]=e15[i]*MeV*cm2/g;}
     186AddData(T0,e15, 15);
    219187 
    220188name [16] = "G4_CARBON_DIOXIDE";
    221189G4double e16[78] = { 93.28, 114.2, 131.9, 147.5, 161.6, 186.6, 208.6, 228.5, 246.8, 263.8, 279.8, 295, 329.8, 361.2, 390.2, 417.1, 442.4, 466.4, 489.1, 510.8, 551.8, 589.8, 625.6, 659.4, 691.5, 722.2, 751.6, 779.8, 807.1, 833.4, 858.9, 883.7, 907.7, 931.1, 1040, 1137, 1225, 1306, 1380, 1449, 1513, 1571, 1676, 1763, 1834, 1891, 1933, 1961, 1977, 1982, 1978, 1967, 1952, 1932, 1911, 1888, 1752, 1614, 1490, 1383, 1290, 1209, 1139, 1077, 973.3, 890, 821.5, 764, 714.9, 672.6, 635.5, 602.6, 573.5, 547.3, 523.7, 502.4, 482.9, 465 };
    222  
    223  for(i=0; i<78; i++) {e[16][i]=e16[i]*MeV*cm2/g;}
     190AddData(T0,e16, 16);
    224191 
    225192name [17] = "G4_CALCIUM_FLUORIDE";
    226193G4double e17[78] = { 72.78, 90.74, 106.1, 119.8, 132.3, 154.7, 174.6, 192.8, 209.7, 225.5, 240.4, 254.5, 287.2, 317, 344.6, 370.4, 394.6, 417.6, 439.5, 460.5, 499.9, 536.5, 570.8, 603.1, 633.6, 662.6, 690.1, 716.4, 741.5, 765.6, 788.6, 810.8, 832.1, 852.6, 944.4, 1022, 1088, 1145, 1194, 1237, 1275, 1308, 1361, 1401, 1431, 1453, 1467, 1476, 1481, 1481, 1479, 1474, 1466, 1458, 1447, 1436, 1352, 1256, 1166, 1086, 1016, 954.4, 900.2, 852.3, 772.1, 708.1, 655.5, 610.7, 573.3, 540.6, 511.9, 486.6, 464, 443.8, 425.4, 408.7, 393.4, 379.4 };
    227  
    228  for(i=0; i<78; i++) {e[17][i]=e17[i]*MeV*cm2/g;}
     194AddData(T0,e17, 17);
    229195 
    230196name [18] = "G4_CERIC_SULFATE";
    231197G4double e18[78] = { 99.73, 123.7, 144.1, 162.3, 178.8, 208.3, 234.6, 258.5, 280.5, 301.2, 320.6, 339.1, 381.8, 420.6, 456.5, 490, 521.6, 551.5, 580.1, 607.4, 658.9, 707, 752.2, 795, 835.7, 874.6, 911.8, 947.6, 982, 1015, 1047, 1078, 1109, 1138, 1273, 1391, 1497, 1591, 1676, 1753, 1822, 1884, 1990, 2074, 2140, 2190, 2227, 2251, 2266, 2273, 2272, 2266, 2254, 2238, 2220, 2198, 2049, 1886, 1737, 1607, 1495, 1399, 1315, 1242, 1120, 1023, 942.8, 875.6, 818.4, 769.2, 726.1, 688, 654.2, 624, 596.7, 572, 549.5, 528.9 };
    232  
    233  for(i=0; i<78; i++) {e[18][i]=e18[i]*MeV*cm2/g;}
     198AddData(T0,e18, 18);
    234199 
    235200name [19] = "G4_CELLULOSE_NITRATE";
    236201G4double e19[78] = { 157.6, 186.4, 209.9, 230.3, 248.3, 279.7, 306.8, 330.8, 352.6, 372.6, 391.2, 408.7, 448.1, 483.2, 514.9, 544.1, 571.1, 596.4, 620.3, 642.8, 684.8, 723.2, 758.8, 792, 823.2, 852.7, 880.6, 907.2, 932.6, 956.9, 980.2, 1003, 1024, 1045, 1139, 1220, 1290, 1353, 1408, 1457, 1502, 1541, 1608, 1662, 1704, 1736, 1761, 1778, 1789, 1796, 1798, 1796, 1790, 1782, 1772, 1760, 1674, 1574, 1476, 1385, 1302, 1227, 1160, 1099, 993.8, 909.3, 839.7, 781.1, 731.2, 688.1, 650.2, 616.7, 587, 560.3, 536.2, 514.4, 494.5, 476.2 };
    237  
    238  for(i=0; i<78; i++) {e[19][i]=e19[i]*MeV*cm2/g;}
     202AddData(T0,e19, 19);
    239203 
    240204name [20] = "G4_BONE_CORTICAL_ICRP";
    241205G4double e20[78] = { 109.1, 132.8, 152.8, 170.4, 186.2, 214.4, 239.3, 261.7, 282.4, 301.6, 319.7, 336.8, 376.1, 411.7, 444.5, 475, 503.6, 530.7, 556.5, 581.1, 627.4, 670.4, 710.8, 748.9, 785, 819.4, 852.4, 883.9, 914.3, 943.5, 971.7, 999, 1025, 1051, 1168, 1270, 1360, 1440, 1511, 1574, 1630, 1680, 1763, 1826, 1872, 1905, 1927, 1939, 1943, 1941, 1933, 1921, 1905, 1887, 1866, 1844, 1720, 1593, 1475, 1369, 1274, 1193, 1123, 1062, 959.2, 877.1, 809.7, 753, 704.9, 663.4, 627, 594.9, 566.3, 540.6, 517.5, 496.5, 477.4, 459.8 };
    242  
    243  for(i=0; i<78; i++) {e[20][i]=e20[i]*MeV*cm2/g;}
     206AddData(T0,e20, 20);
    244207 
    245208name [21] = "G4_CESIUM_IODIDE";
    246209G4double e21[78] = { 40.6, 48.54, 55.16, 60.95, 66.15, 75.33, 83.38, 90.64, 97.29, 103.5, 109.3, 114.8, 127.3, 138.7, 149.2, 158.9, 168, 176.7, 184.9, 192.8, 207.6, 221.3, 234.2, 246.4, 258, 269.1, 279.7, 289.9, 299.7, 309.2, 318.3, 327.1, 335.7, 344, 382.3, 415.8, 445.6, 472.1, 495.7, 516.7, 535.4, 551.8, 578.9, 599.2, 613.8, 623.8, 629.9, 633, 633.6, 632.3, 629.5, 625.5, 620.6, 615.1, 609.1, 602.8, 567.7, 533, 501.8, 474.4, 450.3, 429, 410.1, 393.3, 364.6, 340.9, 321, 304, 289.2, 275.9, 264.1, 253.6, 243.9, 235, 226.7, 218.9, 211.9, 205.4 };
    247  
    248  for(i=0; i<78; i++) {e[21][i]=e21[i]*MeV*cm2/g;}
     210AddData(T0,e21, 21);
    249211 
    250212name [22] = "G4_Cu";
    251213G4double e22[78] = { 29.51, 36.49, 42.42, 47.68, 52.45, 60.98, 68.54, 75.4, 81.74, 87.65, 93.23, 98.51, 110.7, 121.8, 132, 141.5, 150.5, 159, 167.2, 174.9, 189.5, 203.2, 216, 228.1, 239.7, 250.7, 261.3, 271.4, 281.2, 290.7, 299.8, 308.7, 317.3, 325.6, 364.2, 398.4, 429.1, 456.8, 482.1, 505.1, 526.2, 545.4, 579, 607, 630.1, 649.1, 664.4, 676.6, 686.2, 693.4, 698.8, 702.4, 704.6, 705.7, 705.7, 704.9, 692.5, 672.6, 650.3, 627.6, 606, 585.6, 566.3, 548, 514, 483.4, 455.8, 431, 408.4, 388, 369.6, 353.7, 339.1, 325.7, 313.4, 302, 291.7, 282.3 };
    252  
    253  for(i=0; i<78; i++) {e[22][i]=e22[i]*MeV*cm2/g;}
     214AddData(T0,e22, 22);
    254215 
    255216name [23] = "G4_Fe";
    256217G4double e23[78] = { 54.06, 65.42, 74.91, 83.2, 90.66, 103.8, 115.3, 125.6, 135.1, 143.8, 152, 159.8, 177.4, 193.3, 207.8, 221.3, 233.9, 245.7, 256.9, 267.6, 287.7, 306.2, 323.5, 339.8, 355.2, 369.8, 383.8, 397.1, 410, 422.3, 434.2, 445.7, 456.9, 467.6, 517.1, 560.6, 599.4, 634.3, 665.9, 694.6, 720.8, 744.8, 786.6, 821.5, 850.4, 874.1, 893.1, 908.1, 919.6, 928, 933.6, 936.8, 938, 937.3, 935.1, 931.5, 899.9, 856.7, 810.9, 766.9, 727.3, 691.9, 660.2, 631.5, 581.8, 540.1, 504.6, 473.9, 447.2, 423.6, 402.6, 383.5, 366.9, 352, 338.3, 325.7, 314.1, 303.6 };
    257  
    258  for(i=0; i<78; i++) {e[23][i]=e23[i]*MeV*cm2/g;}
     218AddData(T0,e23, 23);
    259219 
    260220name [24] = "G4_FERROUS_SULFATE";
    261221G4double e24[78] = { 99.58, 123.5, 144, 162.1, 178.6, 208.1, 234.3, 258.2, 280.2, 300.8, 320.3, 338.7, 381.4, 420.2, 456, 489.5, 521, 551, 579.5, 606.8, 658.3, 706.3, 751.5, 794.2, 834.9, 873.7, 910.9, 946.6, 981, 1014, 1046, 1077, 1108, 1137, 1271, 1390, 1495, 1590, 1675, 1751, 1820, 1882, 1988, 2072, 2138, 2188, 2225, 2250, 2265, 2271, 2271, 2264, 2253, 2237, 2218, 2197, 2048, 1886, 1738, 1609, 1497, 1401, 1317, 1244, 1122, 1025, 944.6, 877.4, 820, 770.7, 727.5, 689.3, 655.4, 625.2, 597.8, 573.1, 550.5, 529.9 };
    262  
    263  for(i=0; i<78; i++) {e[24][i]=e24[i]*MeV*cm2/g;}
     222AddData(T0,e24, 24);
    264223 
    265224name [25] = "G4_Gd";
    266225G4double e25[78] = { 38.11, 45.4, 51.41, 56.61, 61.25, 69.34, 76.36, 82.61, 88.29, 93.53, 98.41, 103, 113.4, 122.7, 131.1, 138.9, 146.1, 152.9, 159.3, 165.4, 176.7, 187.1, 196.8, 205.9, 214.4, 222.5, 230.3, 237.6, 244.7, 251.5, 258, 264.3, 270.3, 276.2, 303.1, 326.6, 347.4, 366.2, 383.1, 398.5, 412.5, 425.4, 447.8, 466.5, 482.1, 494.8, 505.1, 513.2, 519.4, 523.9, 526.9, 528.6, 529.1, 528.6, 527.3, 525.2, 505.6, 481, 456.8, 434.6, 414.6, 396.6, 380.5, 366, 340.9, 319.7, 301.6, 285.8, 272, 259.8, 248.8, 239, 230.1, 222, 214.6, 207.7, 201.4, 195.6 };
    267  
    268  for(i=0; i<78; i++) {e[25][i]=e25[i]*MeV*cm2/g;}
     226AddData(T0,e25, 25);
    269227 
    270228name [26] = "G4_Ge";
    271229G4double e26[78] = { 47.65, 57.57, 65.83, 73.05, 79.53, 90.94, 100.9, 109.9, 118, 125.6, 132.7, 139.4, 154.6, 168.3, 180.8, 192.3, 203.1, 213.3, 222.9, 232, 249.1, 264.8, 279.5, 293.2, 306.1, 318.4, 330, 341.1, 351.7, 361.8, 371.5, 380.8, 389.8, 398.4, 437.2, 469.9, 497.8, 521.7, 542.3, 560.1, 575.5, 588.9, 610.7, 627.4, 640.1, 649.9, 657.3, 662.8, 666.8, 669.6, 671.4, 672.3, 672.4, 671.9, 670.9, 669.4, 656.9, 639.5, 619.8, 599.4, 578.4, 557.6, 537.5, 518.5, 483.6, 452.9, 425.8, 401.8, 380.5, 361.5, 344.3, 328.6, 315.1, 303.1, 292.1, 282, 272.6, 263.8 };
    272  
    273  for(i=0; i<78; i++) {e[26][i]=e26[i]*MeV*cm2/g;}
     230AddData(T0,e26, 26);
    274231 
    275232name [27] = "G4_Pyrex_Glass";
    276233G4double e27[78] = { 83.85, 102.1, 117.5, 131, 143.3, 165, 184.1, 201.3, 217.2, 232, 245.9, 259, 289.2, 316.5, 341.5, 364.8, 386.7, 407.4, 427.1, 445.8, 481.1, 513.8, 544.4, 573.2, 600.6, 626.6, 651.5, 675.3, 698.1, 720.1, 741.3, 761.7, 781.5, 800.6, 888, 963.9, 1031, 1090, 1142, 1189, 1231, 1268, 1330, 1378, 1414, 1441, 1460, 1473, 1481, 1485, 1484, 1481, 1475, 1466, 1456, 1445, 1389, 1323, 1249, 1171, 1095, 1029, 971.4, 920.7, 835.9, 768, 711.5, 663.8, 622.8, 587.4, 556.1, 528.4, 503.7, 481.5, 461.4, 443.2, 426.5, 411.2 };
    277  
    278  for(i=0; i<78; i++) {e[27][i]=e27[i]*MeV*cm2/g;}
     234AddData(T0,e27, 27);
    279235 
    280236name [28] = "G4_H";
    281237G4double e28[78] = { 212, 275.4, 331.7, 383, 430.9, 518.8, 599.2, 674, 744.5, 811.5, 875.6, 937.1, 1082, 1217, 1344, 1465, 1580, 1691, 1798, 1901, 2098, 2285, 2463, 2634, 2798, 2956, 3108, 3256, 3399, 3538, 3674, 3805, 3933, 4058, 4637, 5152, 5610, 6019, 6383, 6705, 6988, 7235, 7632, 7915, 8100, 8203, 8240, 8222, 8161, 8067, 7947, 7808, 7655, 7494, 7327, 7157, 6345, 5647, 5068, 4588, 4188, 3860, 3585, 3351, 2971, 2675, 2438, 2242, 2078, 1939, 1818, 1713, 1620, 1538, 1464, 1398, 1337, 1283 };
    282  
    283  for(i=0; i<78; i++) {e[28][i]=e28[i]*MeV*cm2/g;}
    284  
    285 name [29] = "G4_HELIUM";
     238AddData(T0,e28, 28);
     239 
     240name [29] = "G4_He";
    286241G4double e29[78] = { 87.26, 110.8, 131.3, 149.8, 166.8, 197.7, 225.5, 251.1, 275, 297.5, 318.9, 339.4, 387, 430.9, 471.8, 510.4, 547, 581.9, 615.3, 647.5, 708.7, 766.1, 820.5, 872.3, 921.8, 969.3, 1015, 1059, 1102, 1143, 1183, 1221, 1259, 1296, 1465, 1614, 1748, 1867, 1975, 2071, 2156, 2233, 2361, 2460, 2535, 2588, 2624, 2644, 2652, 2650, 2639, 2621, 2598, 2571, 2540, 2507, 2323, 2139, 1976, 1832, 1706, 1593, 1493, 1402, 1249, 1130, 1033, 953.8, 886.8, 829.5, 779.8, 736.4, 697.9, 663.7, 632.9, 605.2, 580, 557 };
    287  
    288  for(i=0; i<78; i++) {e[29][i]=e29[i]*MeV*cm2/g;}
     242AddData(T0,e29, 29);
    289243 
    290244name [30] = "G4_KAPTON";
    291245G4double e30[78] = { 165.5, 197.6, 224.2, 247.2, 267.8, 304, 335.4, 363.5, 389.1, 412.8, 434.8, 455.6, 502.9, 545.2, 583.8, 619.4, 652.6, 683.8, 713.3, 741.2, 793.5, 841.6, 886.3, 928.2, 967.7, 1005, 1041, 1074, 1107, 1138, 1167, 1196, 1223, 1250, 1369, 1471, 1560, 1636, 1703, 1762, 1812, 1857, 1928, 1981, 2018, 2042, 2056, 2062, 2061, 2054, 2043, 2028, 2010, 1990, 1969, 1946, 1819, 1688, 1565, 1451, 1350, 1264, 1190, 1125, 1017, 929.8, 858.3, 798.2, 747, 702.8, 664, 629.8, 599.3, 571.9, 547.2, 524.8, 504.4, 485.7 };
    292  
    293  for(i=0; i<78; i++) {e[30][i]=e30[i]*MeV*cm2/g;}
     246AddData(T0,e30, 30);
    294247 
    295248name [31] = "G4_Kr";
    296249G4double e31[78] = { 10.15, 13.69, 16.93, 19.96, 22.84, 28.23, 33.29, 38.08, 42.66, 47.08, 51.35, 55.5, 65.43, 74.84, 83.85, 92.52, 100.9, 109.1, 117, 124.7, 139.7, 154.1, 168, 181.5, 194.6, 207.4, 219.9, 232.1, 244, 255.7, 267.2, 278.4, 289.5, 300.3, 351.9, 399.6, 443.7, 484.4, 522.1, 556.7, 588.4, 617.2, 666.6, 705.7, 735.5, 757, 771.4, 779.9, 783.4, 783, 779.4, 773.6, 765.9, 757, 747.2, 736.9, 683.7, 635.6, 595.2, 561.5, 533, 508.6, 487.3, 468.5, 439.9, 417.9, 398.8, 381.4, 364.9, 349.2, 334.2, 319.8, 306.2, 293.7, 282.8, 272.8, 263.6, 255.2 };
    297  
    298  for(i=0; i<78; i++) {e[31][i]=e31[i]*MeV*cm2/g;}
     250AddData(T0,e31, 31);
    299251 
    300252name [32] = "G4_LITHIUM_TETRABORATE";
    301253G4double e32[78] = { 132.7, 159.4, 181.6, 200.9, 218.2, 248.6, 275, 298.7, 320.4, 340.4, 359.1, 376.6, 416.8, 452.7, 485.5, 515.8, 544, 570.6, 595.8, 619.7, 664.3, 705.6, 743.9, 779.9, 813.9, 846.1, 876.8, 906.1, 934.2, 961.1, 987, 1012, 1036, 1059, 1166, 1258, 1338, 1410, 1474, 1531, 1583, 1628, 1706, 1767, 1814, 1849, 1874, 1891, 1899, 1902, 1899, 1891, 1875, 1852, 1825, 1795, 1638, 1494, 1375, 1276, 1193, 1121, 1058, 1002, 908.8, 833.2, 770.5, 717.6, 672.4, 633.2, 598.8, 568.3, 541.2, 516.9, 494.8, 474.9, 456.6, 439.9 };
    302  
    303  for(i=0; i<78; i++) {e[32][i]=e32[i]*MeV*cm2/g;}
     254AddData(T0,e32, 32);
    304255 
    305256name [33] = "G4_LITHIUM_FLUORIDE";
    306257G4double e33[78] = { 118.7, 142.6, 162.5, 179.7, 195.2, 222.4, 246, 267.2, 286.5, 304.3, 321, 336.6, 372.4, 404.4, 433.5, 460.4, 485.5, 509.1, 531.4, 552.6, 592.1, 628.5, 662.4, 694.1, 724.1, 752.4, 779.4, 805.1, 829.6, 853.2, 875.9, 897.6, 918.7, 938.9, 1031, 1110, 1179, 1240, 1294, 1341, 1383, 1421, 1483, 1530, 1566, 1592, 1610, 1621, 1627, 1627, 1624, 1618, 1609, 1598, 1585, 1571, 1483, 1387, 1296, 1214, 1140, 1074, 1015, 962.2, 872, 799.7, 739.5, 688.5, 644.8, 606.9, 573.7, 544.4, 518.3, 494.9, 473.6, 454.3, 436.7, 420.6 };
    307  
    308  for(i=0; i<78; i++) {e[33][i]=e33[i]*MeV*cm2/g;}
     258AddData(T0,e33, 33);
    309259 
    310260name [34] = "G4_M3_WAX";
    311261G4double e34[78] = { 173.6, 209, 238.5, 264.3, 287.6, 328.7, 364.7, 397.1, 426.9, 454.5, 480.4, 504.9, 561, 611.6, 658, 701.1, 741.6, 779.8, 816, 850.6, 915.4, 975.6, 1032, 1085, 1135, 1182, 1228, 1271, 1313, 1353, 1392, 1429, 1465, 1499, 1657, 1792, 1910, 2012, 2101, 2179, 2247, 2305, 2398, 2463, 2507, 2533, 2544, 2544, 2534, 2517, 2494, 2468, 2437, 2405, 2371, 2335, 2154, 1981, 1825, 1686, 1564, 1460, 1372, 1295, 1167, 1064, 980.4, 910.2, 850.4, 798.9, 753.8, 714.2, 678.9, 647.3, 618.8, 593, 569.4, 547.9 };
    312  
    313  for(i=0; i<78; i++) {e[34][i]=e34[i]*MeV*cm2/g;}
     262AddData(T0,e34, 34);
    314263 
    315264name [35] = "G4_MS20_TISSUE";
    316265G4double e35[78] = { 163.5, 196.6, 224.1, 248.2, 269.8, 308, 341.4, 371.4, 398.9, 424.4, 448.3, 470.9, 522.5, 569, 611.6, 651.1, 688, 722.9, 756, 787.5, 846.6, 901.2, 952.3, 1000, 1046, 1089, 1130, 1169, 1207, 1243, 1278, 1311, 1344, 1375, 1516, 1638, 1744, 1836, 1916, 1986, 2048, 2101, 2185, 2247, 2288, 2314, 2327, 2330, 2325, 2312, 2295, 2273, 2249, 2222, 2193, 2163, 2002, 1845, 1703, 1575, 1463, 1368, 1286, 1215, 1097, 1001, 923.2, 857.7, 802, 753.9, 711.7, 674.6, 641.6, 611.9, 585.2, 561, 539, 518.8 };
    317  
    318  for(i=0; i<78; i++) {e[35][i]=e35[i]*MeV*cm2/g;}
     266AddData(T0,e35, 35);
    319267 
    320268name [36] = "G4_METHANE";
    321269G4double e36[78] = { 197.5, 241.8, 279.3, 312.2, 342, 394.9, 441.5, 483.7, 522.4, 558.5, 592.4, 624.4, 698.1, 764.8, 826, 883.1, 936.6, 987.3, 1035, 1081, 1168, 1249, 1324, 1396, 1464, 1529, 1591, 1650, 1708, 1764, 1818, 1870, 1920, 1970, 2198, 2402, 2586, 2754, 2907, 3047, 3175, 3291, 3492, 3652, 3773, 3856, 3905, 3921, 3899, 3849, 3783, 3708, 3627, 3544, 3460, 3378, 2998, 2685, 2432, 2226, 2055, 1911, 1789, 1683, 1508, 1370, 1257, 1163, 1084, 1015, 955.9, 903.7, 857.5, 816.2, 779.1, 745.5, 714.9, 687.1 };
    322  
    323  for(i=0; i<78; i++) {e[36][i]=e36[i]*MeV*cm2/g;}
     270AddData(T0,e36, 36);
    324271 
    325272name [37] = "G4_Mo";
    326273G4double e37[78] = { 58.22, 68.98, 77.79, 85.4, 92.16, 103.9, 114.1, 123.1, 131.3, 138.8, 145.8, 152.4, 167.3, 180.5, 192.5, 203.5, 213.8, 223.4, 232.4, 241, 256.9, 271.6, 285.1, 297.8, 309.8, 321.1, 331.8, 342.1, 351.9, 361.3, 370.3, 379, 387.4, 395.5, 432.4, 464.5, 492.9, 518.2, 541, 561.6, 580.4, 597.4, 626.9, 651.2, 671.2, 687.3, 700.1, 710, 717.3, 722.3, 725.4, 726.7, 726.5, 725, 722.3, 718.8, 690.9, 655, 617.8, 582.6, 552.1, 525.7, 502.3, 481.5, 445.5, 415.5, 389.9, 367.7, 348.1, 330.6, 314.8, 300.9, 288.6, 277.3, 266.9, 257.6, 249, 241.2 };
    327  
    328  for(i=0; i<78; i++) {e[37][i]=e37[i]*MeV*cm2/g;}
     274AddData(T0,e37, 37);
    329275 
    330276name [38] = "G4_MUSCLE_WITH_SUCROSE";
    331277G4double e38[78] = { 111.7, 137.5, 159.4, 178.8, 196.5, 227.9, 255.7, 281, 304.4, 326.2, 346.7, 366.2, 411.2, 452, 489.7, 525, 558.1, 589.5, 619.5, 648.1, 702.2, 752.5, 799.9, 844.6, 887.2, 927.9, 966.8, 1004, 1040, 1075, 1108, 1141, 1172, 1203, 1343, 1467, 1576, 1674, 1762, 1841, 1912, 1975, 2081, 2165, 2230, 2277, 2310, 2331, 2342, 2344, 2339, 2329, 2313, 2293, 2270, 2244, 2074, 1896, 1739, 1607, 1494, 1398, 1314, 1241, 1120, 1022, 942.4, 875.3, 818.1, 768.9, 725.8, 687.7, 653.9, 623.7, 596.4, 571.7, 549.2, 528.6 };
    332  
    333  for(i=0; i<78; i++) {e[38][i]=e38[i]*MeV*cm2/g;}
     278AddData(T0,e38, 38);
    334279 
    335280name [39] = "G4_MUSCLE_WITHOUT_SUCROSE";
    336281G4double e39[78] = { 108.2, 133.5, 155, 174.1, 191.4, 222.4, 249.8, 274.8, 297.8, 319.3, 339.6, 358.9, 403.3, 443.7, 481, 515.9, 548.7, 579.8, 609.5, 637.9, 691.4, 741.4, 788.3, 832.7, 875, 915.3, 953.9, 991.1, 1027, 1061, 1095, 1127, 1158, 1189, 1328, 1451, 1560, 1658, 1745, 1824, 1895, 1958, 2065, 2150, 2215, 2263, 2298, 2320, 2332, 2335, 2331, 2321, 2306, 2287, 2265, 2240, 2075, 1901, 1746, 1613, 1501, 1404, 1320, 1247, 1125, 1027, 946.2, 878.8, 821.4, 772, 728.6, 690.4, 656.4, 626.1, 598.7, 573.9, 551.3, 530.6 };
    337  
    338  for(i=0; i<78; i++) {e[39][i]=e39[i]*MeV*cm2/g;}
     282AddData(T0,e39, 39);
    339283 
    340284name [40] = "G4_MUSCLE_SKELETAL_ICRP";
    341285G4double e40[78] = { 104.5, 129.2, 150.2, 168.8, 185.8, 216.1, 242.9, 267.4, 290, 311.1, 331, 349.8, 393.5, 433.1, 469.7, 503.9, 536.2, 566.7, 595.9, 623.7, 676.3, 725.4, 771.5, 815.1, 856.6, 896.2, 934.1, 970.6, 1006, 1040, 1072, 1104, 1135, 1165, 1302, 1422, 1530, 1626, 1712, 1790, 1860, 1922, 2029, 2113, 2178, 2228, 2263, 2286, 2299, 2304, 2302, 2293, 2280, 2262, 2242, 2218, 2059, 1888, 1735, 1604, 1492, 1396, 1312, 1240, 1118, 1021, 941.1, 874.1, 817, 767.9, 724.9, 686.8, 653.1, 622.9, 595.7, 571, 548.6, 528 };
    342  
    343  for(i=0; i<78; i++) {e[40][i]=e40[i]*MeV*cm2/g;}
     286AddData(T0,e40, 40);
    344287 
    345288name [41] = "G4_MUSCLE_STRIATED_ICRU";
    346289G4double e41[78] = { 104.7, 129.4, 150.5, 169.2, 186.2, 216.5, 243.4, 267.9, 290.5, 311.7, 331.6, 350.5, 394.2, 433.9, 470.6, 504.9, 537.2, 567.8, 596.9, 624.9, 677.5, 726.7, 772.8, 816.5, 858.1, 897.8, 935.8, 972.3, 1007, 1041, 1074, 1106, 1137, 1167, 1304, 1425, 1532, 1629, 1715, 1793, 1863, 1925, 2032, 2116, 2181, 2230, 2265, 2289, 2302, 2306, 2304, 2295, 2282, 2264, 2244, 2220, 2063, 1894, 1742, 1611, 1498, 1401, 1318, 1244, 1123, 1025, 944.5, 877.2, 819.9, 770.6, 727.3, 689.2, 655.3, 625, 597.7, 572.9, 550.4, 529.7 };
    347  
    348  for(i=0; i<78; i++) {e[41][i]=e41[i]*MeV*cm2/g;}
     290AddData(T0,e41, 41);
    349291 
    350292name [42] = "G4_N";
    351293G4double e42[78] = { 82.8, 103.7, 121.6, 137.7, 152.3, 178.7, 202.3, 223.8, 243.8, 262.5, 280.2, 297.1, 336.2, 372, 405.1, 436.2, 465.5, 493.4, 520.1, 545.7, 594.1, 639.3, 682, 722.5, 761, 797.9, 833.4, 867.4, 900.3, 932, 962.8, 992.5, 1021, 1049, 1179, 1293, 1395, 1486, 1567, 1640, 1706, 1765, 1864, 1940, 1999, 2041, 2069, 2086, 2093, 2091, 2083, 2069, 2051, 2030, 2005, 1978, 1819, 1660, 1522, 1406, 1308, 1224, 1151, 1088, 982.9, 898.5, 829.5, 771.1, 721.3, 678.5, 641, 608, 578.6, 552.3, 528.5, 506.9, 487.2, 469.1 };
    352  
    353  for(i=0; i<78; i++) {e[42][i]=e42[i]*MeV*cm2/g;}
     294AddData(T0,e42, 42);
    354295 
    355296name [43] = "G4_SODIUM_IODIDE";
    356297G4double e43[78] = { 35.86, 44.19, 51.24, 57.48, 63.13, 73.21, 82.12, 90.2, 97.64, 104.6, 111.1, 117.3, 131.6, 144.5, 156.4, 167.6, 178, 187.9, 197.3, 206.3, 223.3, 239.1, 253.9, 268, 281.3, 294, 306.2, 317.9, 329.2, 340.1, 350.6, 360.8, 370.6, 380.2, 424.5, 463.5, 498.4, 529.9, 558.2, 583.8, 607, 627.8, 663.4, 691.6, 713.4, 729.6, 740.9, 748.1, 751.7, 752.4, 750.7, 747, 741.7, 735.1, 727.6, 719.5, 664.4, 611.2, 569.4, 538.3, 514, 491.6, 472.1, 454, 422.9, 393.7, 370.2, 349.6, 331.4, 315.3, 301.2, 288.5, 276.8, 266.1, 256.3, 247.1, 238.9, 231.5 };
    357  
    358  for(i=0; i<78; i++) {e[43][i]=e43[i]*MeV*cm2/g;}
     298AddData(T0,e43, 43);
    359299 
    360300name [44] = "G4_Ne";
    361301G4double e44[78] = { 68.73, 83.7, 96.26, 107.3, 117.2, 134.8, 150.3, 164.2, 177, 188.8, 199.9, 210.4, 234.5, 256.2, 276.1, 294.6, 311.9, 328.3, 343.8, 358.6, 386.3, 412, 436.1, 458.8, 480.3, 500.8, 520.3, 539.1, 557.1, 574.5, 591.2, 607.5, 623.2, 638.4, 708.4, 770.3, 825.6, 875.7, 921.2, 962.8, 1001, 1036, 1098, 1150, 1194, 1230, 1260, 1285, 1304, 1319, 1330, 1338, 1343, 1344, 1344, 1341, 1296, 1229, 1160, 1095, 1035, 981.4, 932.6, 888.5, 812.1, 748.3, 695.6, 650.4, 611.3, 577, 546.8, 520, 496, 474.4, 454.8, 437, 420.7, 405.7 };
    362  
    363  for(i=0; i<78; i++) {e[44][i]=e44[i]*MeV*cm2/g;}
    364  
    365 name [45] = "G4_NYLON-6/6";
     302AddData(T0,e44, 44);
     303 
     304name [45] = "G4_NYLON-6-6";
    366305G4double e45[78] = { 167.4, 201.6, 230.3, 255.4, 278, 317.9, 352.9, 384.4, 413.4, 440.3, 465.5, 489.3, 544, 593.3, 638.6, 680.6, 720.1, 757.3, 792.7, 826.4, 889.7, 948.5, 1003, 1055, 1104, 1151, 1195, 1238, 1279, 1318, 1356, 1392, 1427, 1461, 1617, 1750, 1867, 1969, 2059, 2138, 2207, 2267, 2363, 2433, 2482, 2512, 2527, 2531, 2525, 2511, 2491, 2467, 2439, 2408, 2375, 2340, 2160, 1987, 1830, 1690, 1567, 1463, 1374, 1297, 1169, 1066, 981.3, 910.8, 850.9, 799.3, 754.1, 714.4, 679, 647.4, 618.9, 593, 569.5, 547.9 };
    367  
    368  for(i=0; i<78; i++) {e[45][i]=e45[i]*MeV*cm2/g;}
     306AddData(T0,e45, 45);
    369307 
    370308name [46] = "G4_O";
    371 G4double e46[78] = { 105.8, 117.3, 257.6, 1.139e-05, 5.976e-06, 0.005, 248.1, 71.83, 352, 3.186e-05, 2.012e-05, 0.015, 412.7, 40.96, 503.1, 6.782e-05, 5.098e-05, 0.035, 610.6, 24.07, 700.7, 0.0001156, 9.613e-05, 0.07, 820, 15.89, 884.2, 0.0001583, 0.0001354, 0.125, 1124, 8.719, 1280, 0.0002775, 0.0002641, 0.3, 1573, 4.478, 1697, 0.0004528, 0.000448, 0.65, 1818, 2.655, 1822, 0.0006468, 0.0006403, 1, 1667, 1.474, 1431, 0.00138, 0.001539, 2.75, 1038, 0.7076, 860.9, 0.003906, 0.004519, 6, 616.1, 0.3845, 556.8, 0.009419, 0.01034, 9.5, 452, 0.2295, 334.7, 0.03447, 0.04325, 27.5, 196.3, 0.09039, 156.5, 0.1784, 0.2149, 60 };
    372  
    373  for(i=0; i<78; i++) {e[46][i]=e46[i]*MeV*cm2/g;}
     309G4double e46[78] = { 1.058E+02, 1.283E+02, 1.471E+02, 1.636E+02, 1.784E+02, 2.046E+02, 2.275E+02, 2.481E+02, 2.670E+02, 2.845E+02, 3.009E+02, 3.163E+02, 3.518E+02, 3.836E+02, 4.127E+02, 4.398E+02, 4.650E+02, 4.889E+02, 5.115E+02, 5.330E+02, 5.733E+02, 6.106E+02, 6.455E+02, 6.783E+02, 7.094E+02, 7.389E+02, 7.671E+02, 7.941E+02, 8.200E+02, 8.450E+02, 8.690E+02, 8.923E+02, 9.147E+02, 9.365E+02, 1.036E+03, 1.124E+03, 1.202E+03, 1.272E+03, 1.335E+03, 1.392E+03, 1.444E+03, 1.491E+03, 1.573E+03, 1.639E+03, 1.693E+03, 1.735E+03, 1.768E+03, 1.792E+03, 1.808E+03, 1.818E+03, 1.821E+03, 1.820E+03, 1.814E+03, 1.805E+03, 1.792E+03, 1.777E+03, 1.667E+03, 1.544E+03, 1.430E+03, 1.329E+03, 1.241E+03, 1.164E+03, 1.097E+03, 1.038E+03, 9.395E+02, 8.602E+02, 7.947E+02, 7.395E+02, 6.924E+02, 6.519E+02, 6.161E+02, 5.845E+02, 5.564E+02, 5.313E+02, 5.086E+02, 4.880E+02, 4.692E+02, 4.520E+02};
     310AddData(T0,e46, 46);
    374311 
    375312name [47] = "G4_PARAFFIN";
    376313G4double e47[78] = { 193.8, 233, 265.8, 294.4, 320.3, 365.9, 405.9, 441.9, 475, 505.7, 534.5, 561.7, 624.2, 680.6, 732.3, 780.4, 825.5, 868.2, 908.6, 947.2, 1020, 1087, 1150, 1209, 1265, 1319, 1370, 1419, 1465, 1510, 1554, 1595, 1636, 1675, 1852, 2004, 2137, 2253, 2354, 2442, 2518, 2584, 2688, 2762, 2810, 2837, 2848, 2845, 2831, 2810, 2782, 2749, 2713, 2674, 2633, 2592, 2381, 2184, 2007, 1851, 1714, 1598, 1500, 1414, 1272, 1158, 1066, 988.4, 922.7, 866.1, 816.7, 773.2, 734.5, 699.9, 668.8, 640.6, 614.9, 591.4 };
    377  
    378  for(i=0; i<78; i++) {e[47][i]=e47[i]*MeV*cm2/g;}
     314AddData(T0,e47, 47);
    379315 
    380316name [48] = "G4_Pb";
    381317G4double e48[78] = { 17.96, 22.18, 25.76, 28.92, 31.8, 36.93, 41.47, 45.6, 49.4, 52.95, 56.3, 59.46, 66.77, 73.41, 79.52, 85.23, 90.6, 95.69, 100.5, 105.2, 113.9, 122, 129.7, 136.9, 143.8, 150.3, 156.6, 162.7, 168.5, 174.1, 179.5, 184.8, 189.9, 194.9, 217.7, 237.9, 256, 272.3, 287, 300.4, 312.6, 323.6, 342.6, 358.2, 370.7, 380.6, 388.3, 394.2, 398.4, 401.3, 403.1, 404, 404.1, 403.5, 402.4, 401, 392.5, 380.4, 365.3, 348.6, 332, 317.6, 304.9, 293.7, 274.4, 258.3, 244.7, 232.9, 222.5, 213.2, 205, 197.5, 190.7, 184.4, 178.7, 173.4, 168.4, 163.9 };
    382  
    383  for(i=0; i<78; i++) {e[48][i]=e48[i]*MeV*cm2/g;}
    384  
    385 name [49] = "G4_PHOTOGRAPHIC_EMULSION";
     318AddData(T0,e48, 48);
     319 
     320name [49] = "G4_PHOTO_EMULSION";
    386321G4double e49[78] = { 46.69, 57.18, 66.06, 73.91, 81.04, 93.75, 105, 115.2, 124.7, 133.5, 141.8, 149.6, 167.8, 184.3, 199.6, 213.8, 227.3, 240, 252.1, 263.8, 285.7, 306.2, 325.4, 343.6, 361, 377.5, 393.4, 408.7, 423.3, 437.5, 451.2, 464.5, 477.3, 489.8, 547, 597.3, 641.7, 681.2, 716.3, 747.6, 775.5, 800.2, 841.5, 873.5, 897.8, 915.8, 928.6, 937.1, 940, 938.4, 933.8, 927, 918.6, 909.2, 899.1, 888.5, 833.7, 781.8, 735.1, 693.7, 657.1, 624.6, 595.5, 569.4, 524.5, 487.2, 455.6, 428.5, 404.9, 383.9, 365.2, 348.6, 333.8, 320.5, 308.3, 297.2, 287, 277.8 };
    387  
    388  for(i=0; i<78; i++) {e[49][i]=e49[i]*MeV*cm2/g;}
     322AddData(T0,e49, 49);
    389323 
    390324name [50] = "G4_PLASTIC_SC_VINYLTOLUENE";
    391325G4double e50[78] = { 192.4, 229.8, 260.8, 287.8, 312, 354.4, 391.4, 424.6, 454.8, 482.8, 509, 533.7, 590, 640.5, 686.6, 729.3, 769.2, 806.7, 842.2, 876, 939.2, 997.5, 1052, 1103, 1151, 1197, 1240, 1281, 1321, 1359, 1395, 1430, 1464, 1497, 1644, 1769, 1878, 1971, 2053, 2123, 2184, 2236, 2319, 2377, 2414, 2436, 2445, 2443, 2433, 2417, 2396, 2371, 2343, 2314, 2283, 2251, 2091, 1936, 1791, 1657, 1537, 1435, 1349, 1273, 1148, 1047, 964.8, 895.9, 837.3, 786.7, 742.4, 703.5, 668.8, 637.7, 609.7, 584.3, 561.2, 540 };
    392  
    393  for(i=0; i<78; i++) {e[50][i]=e50[i]*MeV*cm2/g;}
     326AddData(T0,e50, 50);
    394327 
    395328name [51] = "G4_POLYCARBONATE";
    396329G4double e51[78] = { 146.3, 178.1, 204.7, 228.1, 249.2, 286.4, 319.1, 348.5, 375.5, 400.6, 424.1, 446.2, 497, 542.8, 584.7, 623.5, 659.9, 694.2, 726.6, 757.6, 815.5, 869.1, 919, 965.9, 1010, 1052, 1092, 1130, 1167, 1202, 1235, 1268, 1299, 1329, 1465, 1581, 1681, 1768, 1843, 1908, 1965, 2013, 2090, 2144, 2180, 2201, 2210, 2209, 2202, 2188, 2170, 2149, 2125, 2099, 2072, 2044, 1912, 1785, 1661, 1543, 1433, 1340, 1261, 1191, 1076, 982.4, 906, 842, 787.5, 740.5, 699.2, 662.9, 630.5, 601.5, 575.3, 551.6, 529.9, 510.1 };
    397  
    398  for(i=0; i<78; i++) {e[51][i]=e51[i]*MeV*cm2/g;}
     330AddData(T0,e51, 51);
    399331 
    400332name [52] = "G4_POLYETHYLENE";
    401333G4double e52[78] = { 168.2, 205.8, 237.5, 265.4, 290.7, 335.4, 374.8, 410.5, 443.2, 473.7, 502.3, 529.3, 591.4, 647.6, 699.1, 747.1, 792.1, 834.6, 874.9, 913.5, 985.9, 1053, 1116, 1175, 1232, 1285, 1336, 1385, 1432, 1478, 1521, 1564, 1604, 1644, 1825, 1983, 2122, 2246, 2355, 2453, 2539, 2615, 2740, 2833, 2899, 2940, 2962, 2967, 2958, 2938, 2908, 2871, 2829, 2782, 2732, 2681, 2418, 2183, 1987, 1826, 1691, 1577, 1480, 1396, 1257, 1145, 1053, 977.1, 912.4, 856.5, 807.8, 764.9, 726.7, 692.6, 661.8, 633.9, 608.6, 585.4 };
    402  
    403  for(i=0; i<78; i++) {e[52][i]=e52[i]*MeV*cm2/g;}
     334AddData(T0,e52, 52);
    404335 
    405336name [53] = "G4_MYLAR";
    406337G4double e53[78] = { 163.2, 195.3, 221.8, 244.9, 265.6, 301.9, 333.5, 361.8, 387.6, 411.5, 433.8, 454.8, 502.7, 545.7, 584.8, 621, 654.8, 686.6, 716.7, 745.3, 798.7, 847.9, 893.8, 936.8, 977.4, 1016, 1052, 1087, 1121, 1153, 1183, 1213, 1241, 1269, 1393, 1500, 1593, 1673, 1744, 1806, 1860, 1908, 1985, 2042, 2083, 2110, 2126, 2133, 2133, 2126, 2115, 2100, 2082, 2061, 2038, 2014, 1874, 1731, 1599, 1482, 1379, 1290, 1215, 1148, 1038, 948.5, 875.3, 813.8, 761.5, 716.3, 676.6, 641.6, 610.5, 582.5, 557.3, 534.4, 513.6, 494.5 };
    407  
    408  for(i=0; i<78; i++) {e[53][i]=e53[i]*MeV*cm2/g;}
     338AddData(T0,e53, 53);
    409339 
    410340name [54] = "G4_PLEXIGLASS";
    411341G4double e54[78] = { 118.7, 146.6, 170.3, 191.4, 210.4, 244.5, 274.7, 302.1, 327.3, 350.9, 373.1, 394.2, 442.7, 486.8, 527.4, 565.2, 600.9, 634.6, 666.7, 697.4, 755.1, 808.9, 859.3, 906.9, 952, 995, 1036, 1075, 1113, 1150, 1185, 1219, 1252, 1283, 1428, 1554, 1665, 1762, 1848, 1923, 1990, 2049, 2144, 2216, 2266, 2300, 2320, 2328, 2327, 2318, 2302, 2282, 2259, 2232, 2203, 2173, 2008, 1847, 1702, 1574, 1464, 1369, 1288, 1217, 1099, 1004, 925.6, 860.1, 804.4, 756.3, 714.1, 676.9, 643.8, 614.2, 587.4, 563.2, 541.1, 520.8 };
    412  
    413  for(i=0; i<78; i++) {e[54][i]=e54[i]*MeV*cm2/g;}
     342AddData(T0,e54, 54);
    414343 
    415344name [55] = "G4_POLYPROPYLENE";
    416345G4double e55[78] = { 193.7, 232.8, 265.4, 293.9, 319.6, 365, 404.8, 440.6, 473.4, 503.9, 532.5, 559.6, 621.6, 677.5, 728.8, 776.5, 821.2, 863.4, 903.5, 941.8, 1014, 1080, 1142, 1201, 1257, 1309, 1360, 1408, 1454, 1499, 1541, 1583, 1622, 1661, 1836, 1986, 2117, 2231, 2331, 2417, 2492, 2557, 2660, 2732, 2779, 2806, 2817, 2814, 2801, 2780, 2752, 2720, 2684, 2646, 2606, 2565, 2359, 2165, 1991, 1836, 1700, 1585, 1488, 1403, 1263, 1150, 1058, 981.3, 916.1, 860, 810.9, 767.8, 729.5, 695.1, 664.3, 636.2, 610.8, 587.5 };
    417  
    418  for(i=0; i<78; i++) {e[55][i]=e55[i]*MeV*cm2/g;}
     346AddData(T0,e55, 55);
    419347 
    420348name [56] = "G4_POLYSTYRENE";
    421349G4double e56[78] = { 153, 187.5, 216.6, 242.2, 265.3, 306.5, 342.7, 375.5, 405.6, 433.6, 460, 484.9, 542.1, 593.8, 641.3, 685.4, 726.9, 766, 803.1, 838.5, 905, 966.6, 1024, 1078, 1130, 1178, 1225, 1269, 1312, 1352, 1392, 1429, 1466, 1501, 1661, 1797, 1915, 2017, 2106, 2183, 2249, 2305, 2394, 2454, 2492, 2511, 2516, 2509, 2494, 2471, 2443, 2410, 2376, 2339, 2301, 2262, 2070, 1895, 1742, 1609, 1493, 1395, 1312, 1239, 1119, 1021, 941.4, 874.6, 817.8, 768.7, 725.7, 687.9, 654.1, 623.9, 596.6, 571.9, 549.4, 528.7 };
    422  
    423  for(i=0; i<78; i++) {e[56][i]=e56[i]*MeV*cm2/g;}
     350AddData(T0,e56, 56);
    424351 
    425352name [57] = "G4_TEFLON";
    426353G4double e57[78] = { 82.7, 99.97, 114.4, 127.1, 138.4, 158.5, 176.2, 192, 206.5, 220, 232.6, 244.5, 271.9, 296.4, 319, 339.8, 359.4, 377.8, 395.3, 412, 443.3, 472.2, 499.3, 524.7, 548.8, 571.7, 593.6, 614.5, 634.6, 653.9, 672.5, 690.4, 707.8, 724.6, 801.6, 868.9, 928.6, 981.9, 1030, 1073, 1112, 1148, 1209, 1260, 1301, 1334, 1361, 1382, 1397, 1408, 1415, 1419, 1420, 1418, 1414, 1409, 1399, 1373, 1319, 1246, 1165, 1095, 1034, 979.4, 887.4, 813.7, 752.5, 700.8, 656.5, 618.1, 584.5, 554.8, 528.3, 504.6, 483, 463.5, 445.6, 429.3 };
    427  
    428  for(i=0; i<78; i++) {e[57][i]=e57[i]*MeV*cm2/g;}
     354AddData(T0,e57, 57);
    429355 
    430356name [58] = "G4_POLYVINYL_CHLORIDE";
    431357G4double e58[78] = { 94.27, 114.4, 131.3, 146.3, 159.9, 184, 205.5, 224.9, 242.9, 259.7, 275.5, 290.5, 325.3, 357, 386.3, 413.7, 439.5, 464.1, 487.6, 510.1, 552.6, 592.4, 629.9, 665.5, 699.4, 731.8, 762.9, 792.9, 821.8, 849.7, 876.7, 902.9, 928.2, 952.9, 1067, 1167, 1255, 1335, 1405, 1468, 1525, 1574, 1657, 1719, 1764, 1795, 1814, 1823, 1824, 1818, 1807, 1792, 1774, 1753, 1731, 1708, 1591, 1482, 1385, 1299, 1222, 1153, 1092, 1037, 941.7, 862.4, 795.8, 739.8, 692.3, 651.2, 615.4, 583.7, 555.6, 530.3, 507.5, 486.9, 468, 450.8 };
    432  
    433  for(i=0; i<78; i++) {e[58][i]=e58[i]*MeV*cm2/g;}
     358AddData(T0,e58, 58);
    434359 
    435360name [59] = "G4_PROPANE";
    436361G4double e59[78] = { 194.5, 234.7, 268.4, 298, 324.7, 372, 413.6, 451.2, 485.8, 518, 548.2, 576.8, 642.6, 702.2, 756.9, 808, 855.9, 901.2, 944.4, 985.6, 1063, 1135, 1203, 1267, 1327, 1385, 1440, 1492, 1543, 1592, 1639, 1684, 1728, 1770, 1964, 2131, 2277, 2404, 2516, 2613, 2698, 2771, 2887, 2969, 3022, 3053, 3065, 3061, 3046, 3021, 2990, 2953, 2912, 2868, 2822, 2775, 2564, 2372, 2191, 2022, 1868, 1739, 1629, 1534, 1377, 1252, 1150, 1065, 993, 931.1, 877.2, 829.9, 787.8, 750.2, 716.4, 685.8, 658, 632.5 };
    437  
    438  for(i=0; i<78; i++) {e[59][i]=e59[i]*MeV*cm2/g;}
     362AddData(T0,e59, 59);
    439363 
    440364name [60] = "G4_Pt";
    441365G4double e60[78] = { 14.45, 17.87, 20.78, 23.37, 25.71, 29.9, 33.61, 36.99, 40.1, 43.01, 45.75, 48.35, 54.36, 59.81, 64.84, 69.54, 73.97, 78.17, 82.17, 86, 93.22, 99.96, 106.3, 112.3, 118, 123.5, 128.7, 133.8, 138.7, 143.4, 147.9, 152.4, 156.7, 160.8, 180.3, 197.6, 213.3, 227.7, 240.9, 253, 264.3, 274.7, 293.2, 309, 322.4, 333.7, 343.1, 350.7, 356.8, 361.6, 365.1, 367.6, 369.1, 369.8, 369.9, 369.3, 364.7, 357, 347.3, 336.6, 325.5, 314.4, 303.6, 293.2, 274.3, 258.5, 245.1, 233.4, 223.1, 214, 205.8, 198.4, 191.6, 185.4, 179.7, 174.4, 169.5, 164.9 };
    442  
    443  for(i=0; i<78; i++) {e[60][i]=e60[i]*MeV*cm2/g;}
     366AddData(T0,e60, 60);
    444367 
    445368name [61] = "G4_Si";
    446369G4double e61[78] = { 47.32, 61.63, 74.34, 85.98, 96.82, 116.8, 135.1, 152.1, 168.2, 183.4, 198.1, 212.1, 245.3, 276.1, 305.2, 332.7, 359.1, 384.4, 408.7, 432.2, 477, 519.3, 559.4, 597.5, 633.9, 668.6, 701.9, 733.7, 764.3, 793.5, 821.6, 848.5, 874.4, 899.1, 1008, 1097, 1168, 1225, 1270, 1307, 1336, 1359, 1390, 1408, 1416, 1417, 1413, 1405, 1395, 1383, 1370, 1356, 1341, 1326, 1310, 1295, 1218, 1146, 1081, 1023, 970.6, 923.9, 881.4, 842.4, 773.1, 713.1, 661.2, 617.4, 579.7, 547, 518.2, 492.7, 470, 449.5, 430.9, 414, 398.6, 384.4 };
    447  
    448  for(i=0; i<78; i++) {e[61][i]=e61[i]*MeV*cm2/g;}
     370AddData(T0,e61, 61);
    449371 
    450372name [62] = "G4_SILICON_DIOXIDE";
    451373G4double e62[78] = { 68.9, 85.1, 98.85, 111, 122.1, 141.8, 159.3, 175.1, 189.8, 203.4, 216.3, 228.5, 256.6, 282.1, 305.7, 327.6, 348.3, 367.9, 386.5, 404.4, 437.9, 469.2, 498.5, 526.3, 552.6, 577.7, 601.7, 624.7, 646.9, 668.2, 688.8, 708.7, 728, 746.7, 832.2, 906.8, 972.6, 1031, 1083, 1129, 1170, 1207, 1268, 1315, 1351, 1377, 1396, 1409, 1417, 1421, 1421, 1419, 1414, 1406, 1397, 1387, 1349, 1301, 1237, 1163, 1087, 1021, 964, 913.7, 829.4, 762.2, 706.3, 659, 618.4, 583.3, 552.3, 524.9, 500.4, 478.4, 458.5, 440.4, 423.9, 408.7 };
    452  
    453  for(i=0; i<78; i++) {e[62][i]=e62[i]*MeV*cm2/g;}
     374AddData(T0,e62, 62);
    454375 
    455376name [63] = "G4_STILBENE";
    456377G4double e63[78] = { 192, 228.9, 259.4, 286, 309.7, 351.2, 387.4, 419.7, 449.2, 476.4, 501.9, 525.8, 580.4, 629.2, 673.8, 714.9, 753.3, 789.4, 823.5, 856, 916.5, 972.3, 1024, 1073, 1119, 1162, 1203, 1243, 1280, 1316, 1351, 1384, 1416, 1446, 1585, 1703, 1805, 1892, 1968, 2034, 2090, 2139, 2215, 2268, 2303, 2323, 2331, 2330, 2321, 2307, 2287, 2265, 2240, 2212, 2184, 2155, 1995, 1841, 1703, 1582, 1477, 1385, 1305, 1233, 1113, 1015, 936, 869.6, 813, 764.1, 721.3, 683.7, 650.1, 620, 592.9, 568.3, 545.9, 525.4 };
    457  
    458  for(i=0; i<78; i++) {e[63][i]=e63[i]*MeV*cm2/g;}
     378AddData(T0,e63, 63);
    459379 
    460380name [64] = "G4_Ti";
    461381G4double e64[78] = { 59.24, 72.81, 84.28, 94.41, 103.6, 119.9, 134.3, 147.4, 159.4, 170.6, 181.1, 191.1, 214, 234.7, 253.8, 271.6, 288.3, 304.1, 319.1, 333.5, 360.5, 385.5, 409, 431.2, 452.2, 472.2, 491.4, 509.7, 527.3, 544.3, 560.6, 576.4, 591.7, 606.5, 674.2, 733.1, 785, 831, 871.7, 907.9, 940, 968.3, 1015, 1051, 1077, 1095, 1106, 1112, 1114, 1112, 1107, 1100, 1092, 1082, 1071, 1059, 995.6, 933.7, 877.6, 827.9, 785.2, 747.8, 714.5, 684.4, 631.9, 587.1, 548.3, 514.3, 484.2, 457.3, 433.4, 412.5, 393.7, 376.7, 361.5, 347.6, 334.9, 323.2 };
    462  
    463  for(i=0; i<78; i++) {e[64][i]=e64[i]*MeV*cm2/g;}
     382AddData(T0,e64, 64);
    464383 
    465384name [65] = "G4_Sn";
    466385G4double e65[78] = { 27.39, 33.96, 39.55, 44.52, 49.04, 57.11, 64.28, 70.8, 76.82, 82.45, 87.76, 92.79, 104.4, 115, 124.8, 133.9, 142.5, 150.6, 158.4, 165.8, 179.8, 192.9, 205.2, 216.8, 227.8, 238.4, 248.4, 258.1, 267.4, 276.4, 285.1, 293.5, 301.6, 309.5, 345.7, 377.3, 405.3, 430.1, 452.1, 471.8, 489.3, 504.8, 530.7, 550.9, 566.3, 577.9, 586.3, 592.2, 596.1, 598.4, 599.3, 599.1, 598.1, 596.4, 594.2, 591.5, 573.8, 552.8, 531.2, 510.1, 488.3, 467, 447, 428.6, 396.3, 369.4, 346.8, 327.7, 311.4, 297.1, 283.9, 271.9, 260.8, 250.6, 241.7, 233.6, 226, 218.9 };
    467  
    468  for(i=0; i<78; i++) {e[65][i]=e65[i]*MeV*cm2/g;}
     386AddData(T0,e65, 65);
    469387 
    470388name [66] = "G4_TISSUE_METHANE";
    471389G4double e66[78] = { 135.1, 165.6, 191.3, 213.9, 234.4, 270.7, 302.8, 331.8, 358.4, 383.2, 406.5, 428.6, 479.3, 525.2, 567.4, 606.7, 643.6, 678.5, 711.7, 743.4, 803.1, 858.6, 910.7, 960.1, 1007, 1052, 1095, 1136, 1176, 1214, 1251, 1287, 1322, 1356, 1514, 1655, 1783, 1899, 2006, 2104, 2193, 2275, 2418, 2535, 2626, 2693, 2737, 2760, 2764, 2752, 2728, 2695, 2655, 2612, 2566, 2519, 2278, 2060, 1878, 1727, 1602, 1494, 1403, 1323, 1191, 1085, 998.2, 926, 864.6, 811.7, 765.6, 724.9, 688.8, 656.5, 627.4, 601.1, 577.1, 555.2 };
    472  
    473  for(i=0; i<78; i++) {e[66][i]=e66[i]*MeV*cm2/g;}
     390AddData(T0,e66, 66);
    474391 
    475392name [67] = "G4_TISSUE_PROPANE";
    476393G4double e67[78] = { 149.7, 181.5, 208.2, 231.7, 252.8, 290.4, 323.5, 353.4, 380.9, 406.5, 430.5, 453.3, 505.7, 553, 596.6, 637.2, 675.4, 711.5, 745.8, 778.6, 840.4, 897.8, 951.6, 1003, 1051, 1097, 1141, 1183, 1224, 1263, 1301, 1337, 1372, 1407, 1563, 1701, 1822, 1929, 2024, 2109, 2185, 2252, 2362, 2446, 2507, 2549, 2573, 2583, 2581, 2569, 2550, 2524, 2494, 2461, 2426, 2389, 2211, 2043, 1887, 1744, 1616, 1507, 1415, 1334, 1201, 1094, 1006, 933.3, 871.4, 818.1, 771.5, 730.5, 694.1, 661.5, 632.1, 605.6, 581.4, 559.3 };
    477  
    478  for(i=0; i<78; i++) {e[67][i]=e67[i]*MeV*cm2/g;}
     394AddData(T0,e67, 67);
    479395 
    480396name [68] = "G4_TOLUENE";
    481397G4double e68[78] = { 192.5, 230, 261, 288.1, 312.3, 354.9, 392, 425.3, 455.6, 483.7, 510, 534.8, 591.3, 642.1, 688.4, 731.3, 771.4, 809.1, 844.8, 878.8, 942.4, 1001, 1056, 1107, 1155, 1201, 1245, 1287, 1327, 1365, 1401, 1437, 1471, 1504, 1652, 1779, 1888, 1983, 2065, 2136, 2197, 2250, 2333, 2392, 2430, 2452, 2461, 2459, 2449, 2433, 2411, 2386, 2358, 2328, 2296, 2264, 2109, 1960, 1817, 1683, 1560, 1456, 1368, 1291, 1163, 1060, 976.6, 906.6, 847.1, 795.7, 750.8, 711.3, 676.1, 644.6, 616.2, 590.5, 567, 545.6 };
    482  
    483  for(i=0; i<78; i++) {e[68][i]=e68[i]*MeV*cm2/g;}
     398AddData(T0,e68, 68);
    484399 
    485400name [69] = "G4_U";
    486401G4double e69[78] = { 13.2, 16.72, 19.77, 22.52, 25.04, 29.61, 33.73, 37.51, 41.03, 44.35, 47.5, 50.51, 57.52, 63.96, 69.97, 75.62, 80.99, 86.11, 91.01, 95.73, 104.7, 113.1, 121.1, 128.7, 136, 143, 149.8, 156.3, 162.6, 168.8, 174.7, 180.5, 186.2, 191.7, 217.4, 240.5, 261.5, 280.8, 298.5, 314.8, 329.8, 343.7, 368, 388.4, 405.3, 419, 429.8, 438.1, 444.2, 448.4, 450.8, 451.8, 451.6, 450.3, 448.2, 445.4, 420, 390.1, 362.9, 339.6, 319.8, 303.1, 288.9, 276.7, 256.9, 241.7, 229.4, 218.6, 209.1, 200.6, 193, 186.1, 179.8, 174, 168.6, 163.7, 159.1, 154.8 };
    487  
    488  for(i=0; i<78; i++) {e[69][i]=e69[i]*MeV*cm2/g;}
     402AddData(T0,e69, 69);
    489403 
    490404name [70] = "G4_W";
    491405G4double e70[78] = { 20.75, 25.23, 28.99, 32.29, 35.26, 40.51, 45.11, 49.26, 53.06, 56.59, 59.9, 63.02, 70.18, 76.63, 82.54, 88.02, 93.16, 98.01, 102.6, 107, 115.2, 122.9, 130, 136.7, 143.1, 149.2, 155, 160.6, 165.9, 171.1, 176.1, 180.9, 185.6, 190.1, 211.1, 229.6, 246.2, 261.3, 275.1, 287.7, 299.3, 310, 328.8, 344.7, 358.1, 369.2, 378.3, 385.6, 391.3, 395.6, 398.7, 400.6, 401.7, 401.9, 401.4, 400.4, 389.5, 374.8, 359.5, 344.8, 331, 318.3, 306.5, 295.7, 276.7, 260.8, 247.3, 235.5, 225.2, 216.1, 207.8, 200.3, 193.5, 187.3, 181.5, 176.2, 171.3, 166.7 };
    492  
    493  for(i=0; i<78; i++) {e[70][i]=e70[i]*MeV*cm2/g;}
     406AddData(T0,e70, 70);
    494407 
    495408name [71] = "G4_WATER";
    496409G4double e71[78] = { 98.91, 122.7, 143.1, 161.1, 177.5, 206.9, 233, 256.8, 278.8, 299.3, 318.6, 337, 379.5, 418.1, 453.8, 487.1, 518.6, 548.3, 576.7, 603.9, 655.2, 703, 748, 790.5, 831, 869.6, 906.6, 942.2, 976.4, 1009, 1041, 1072, 1102, 1131, 1265, 1383, 1488, 1582, 1666, 1743, 1811, 1873, 1978, 2062, 2128, 2178, 2215, 2240, 2255, 2262, 2262, 2256, 2245, 2230, 2211, 2190, 2050, 1896, 1752, 1624, 1511, 1414, 1329, 1255, 1132, 1034, 952.7, 884.8, 826.9, 777.1, 733.4, 694.9, 660.7, 630.1, 602.5, 577.6, 554.8, 534 };
    497  
    498  for(i=0; i<78; i++) {e[71][i]=e71[i]*MeV*cm2/g;}
     410AddData(T0,e71, 71);
    499411 
    500412name [72] = "G4_WATER_VAPOR";
    501413G4double e72[78] = { 126.3, 154.7, 178.7, 199.8, 218.8, 252.7, 282.5, 309.5, 334.3, 357.3, 379, 399.5, 446.7, 489.3, 528.5, 565, 599.2, 631.6, 662.4, 691.9, 747.3, 798.8, 847.2, 892.9, 936.3, 977.8, 1018, 1056, 1093, 1128, 1163, 1196, 1228, 1260, 1405, 1535, 1652, 1758, 1855, 1942, 2022, 2094, 2216, 2309, 2377, 2422, 2446, 2455, 2453, 2446, 2436, 2423, 2409, 2392, 2371, 2346, 2169, 1971, 1797, 1653, 1537, 1437, 1351, 1275, 1149, 1049, 965.8, 896.6, 837.6, 786.9, 742.5, 703.3, 668.6, 637.5, 609.5, 584.2, 561.1, 539.9 };
    502  
    503  for(i=0; i<78; i++) {e[72][i]=e72[i]*MeV*cm2/g;}
     414AddData(T0,e72, 72);
    504415 
    505416name [73] = "G4_Xe";
    506417G4double e73[78] = { 18.11, 23.3, 27.86, 31.99, 35.83, 42.84, 49.2, 55.1, 60.63, 65.87, 70.87, 75.65, 86.89, 97.3, 107.1, 116.3, 125.1, 133.5, 141.7, 149.5, 164.4, 178.6, 192, 204.9, 217.3, 229.2, 240.7, 251.8, 262.6, 273.1, 283.4, 293.3, 303, 312.5, 356.7, 396.5, 432.5, 465.2, 494.9, 521.8, 546.1, 567.9, 604.7, 633.2, 654.5, 669.3, 678.8, 683.6, 684.6, 682.5, 678, 671.7, 663.9, 655.1, 645.6, 635.6, 584.6, 538.7, 500.4, 468.8, 446.7, 430.5, 417.1, 405.3, 383.9, 364, 344.9, 326.8, 309.7, 294.6, 281.3, 269.5, 258.7, 248.8, 239.6, 231.1, 223.2, 216.2 };
    507  
    508  for(i=0; i<78; i++) {e[73][i]=e73[i]*MeV*cm2/g;}
     418AddData(T0,e73, 73);
    509419}
     420
     421void G4ASTARStopping::AddData(G4double* ekin, G4double* s, G4int idx)
     422{
     423sdata[idx] = new G4LPhysicsFreeVector(78, ekin[0]*MeV, ekin[77]*MeV);
     424const G4double fac = MeV*cm2/g;
     425for(size_t i=0; i<78; ++i) { sdata[idx]->PutValues(i, ekin[i]*MeV, s[i]*fac); }
     426sdata[idx]->SetSpline(true);
     427}
  • trunk/source/processes/electromagnetic/standard/src/G4BetheBlochModel.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4BetheBlochModel.cc,v 1.36 2009/12/03 17:26:40 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4BetheBlochModel.cc,v 1.37 2010/05/27 10:25:59 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    145145                                              G4double kineticEnergy)
    146146{
    147   // this method is called only for ions
     147  // this method is called only for ions, so no check if it is an ion
    148148  return corr->GetParticleCharge(p,mat,kineticEnergy);
     149}
     150
     151//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     152
     153void G4BetheBlochModel::SetupParameters()
     154{
     155  mass = particle->GetPDGMass();
     156  spin = particle->GetPDGSpin();
     157  G4double q = particle->GetPDGCharge()/eplus;
     158  chargeSquare = q*q;
     159  ratio = electron_mass_c2/mass;
     160  G4double magmom =
     161    particle->GetPDGMagneticMoment()*mass/(0.5*eplus*hbar_Planck*c_squared);
     162  magMoment2 = magmom*magmom - 1.0;
     163  formfact = 0.0;
     164  if(particle->GetLeptonNumber() == 0) {
     165    G4double x = 0.8426*GeV;
     166    if(spin == 0.0 && mass < GeV) {x = 0.736*GeV;}
     167    else if(mass > GeV) {
     168      x /= nist->GetZ13(mass/proton_mass_c2);
     169      //        tlimit = 51.2*GeV*A13[iz]*A13[iz];
     170    }
     171    formfact = 2.0*electron_mass_c2/(x*x);
     172    tlimit   = 2.0/formfact;
     173  }
    149174}
    150175
     
    170195
    171196    // +term for spin=1/2 particle
    172     if( 0.5 == spin ) cross += 0.5*(maxEnergy - cutEnergy)/energy2;
     197    if( 0.5 == spin ) { cross += 0.5*(maxEnergy - cutEnergy)/energy2; }
    173198
    174199    // High order correction different for hadrons and ions
     
    225250{
    226251  G4double tmax      = MaxSecondaryEnergy(p, kineticEnergy);
    227   G4double cutEnergy = min(cut,tmax);
     252  G4double cutEnergy = std::min(cut,tmax);
    228253
    229254  G4double tau   = kineticEnergy/mass;
     
    234259  G4double eexc  = material->GetIonisation()->GetMeanExcitationEnergy();
    235260  G4double eexc2 = eexc*eexc;
    236   //G4double cden  = material->GetIonisation()->GetCdensity();
    237   //G4double mden  = material->GetIonisation()->GetMdensity();
    238   //G4double aden  = material->GetIonisation()->GetAdensity();
    239   //G4double x0den = material->GetIonisation()->GetX0density();
    240   //G4double x1den = material->GetIonisation()->GetX1density();
    241261
    242262  G4double eDensity = material->GetElectronDensity();
     
    252272  // density correction
    253273  G4double x = log(bg2)/twoln10;
    254   //if ( x >= x0den ) {
    255   //  dedx -= twoln10*x - cden ;
    256   //  if ( x < x1den ) dedx -= aden*pow((x1den-x),mden) ;
    257   //}
    258274  dedx -= material->GetIonisation()->DensityCorrection(x);
    259275
     
    277293
    278294//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    279 /*
    280 void G4BetheBlochModel::CorrectionsAlongStep(const G4MaterialCutsCouple*,
    281                                              const G4DynamicParticle*,
    282                                              G4double&,
    283                                              G4double&,
    284                                              G4double)
    285 {}
    286 */
    287295
    288296void G4BetheBlochModel::CorrectionsAlongStep(const G4MaterialCutsCouple* couple,
  • trunk/source/processes/electromagnetic/standard/src/G4BraggModel.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4BraggModel.cc,v 1.23 2009/11/10 19:25:47 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4BraggModel.cc,v 1.26 2010/06/04 09:08:43 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    9090  theZieglerFactor = eV*cm2*1.0e-15;
    9191  theElectron = G4Electron::Electron();
     92
     93  corr = G4LossTableManager::Instance()->EmCorrections();
    9294}
    9395
     
    100102
    101103G4double G4BraggModel::MinEnergyCut(const G4ParticleDefinition*,
    102                                     const G4MaterialCutsCouple* couple)
    103 {
    104   return couple->GetMaterial()->GetIonisation()->GetMeanExcitationEnergy();
     104                                    const G4MaterialCutsCouple*)
     105{
     106  return 0.1*keV;
     107  // return couple->GetMaterial()->GetIonisation()->GetMeanExcitationEnergy();
    105108}
    106109
     
    110113                              const G4DataVector&)
    111114{
    112   if(p != particle) SetParticle(p);
     115  if(p != particle) { SetParticle(p); }
    113116
    114117  // always false before the run
     
    120123    G4String pname = particle->GetParticleName();
    121124    if(particle->GetParticleType() == "nucleus" &&
    122        pname != "deuteron" && pname != "triton") isIon = true;
    123 
    124     corr = G4LossTableManager::Instance()->EmCorrections();
     125       pname != "deuteron" && pname != "triton") { isIon = true; }
    125126
    126127    fParticleChange = GetParticleChangeForLoss();
     
    146147                                         G4double kineticEnergy)
    147148{
    148   // this method is called only for ions
     149  // this method is called only for ions, so no check if it is an ion
    149150  return corr->GetParticleCharge(p,mat,kineticEnergy);
    150151}
     
    161162  G4double tmax      = MaxSecondaryEnergy(p, kineticEnergy);
    162163  G4double maxEnergy = std::min(tmax,maxKinEnergy);
    163   if(cutEnergy < tmax) {
     164  if(cutEnergy < maxEnergy) {
    164165
    165166    G4double energy  = kineticEnergy + mass;
     
    215216  G4double tkin  = kineticEnergy/massRate;
    216217  G4double dedx  = 0.0;
    217   if(tkin > lowestKinEnergy) dedx = DEDX(material, tkin);
    218   else      dedx = DEDX(material, lowestKinEnergy)*sqrt(tkin/lowestKinEnergy);
     218  if(tkin > lowestKinEnergy) { dedx = DEDX(material, tkin); }
     219  else { dedx = DEDX(material, lowestKinEnergy)*sqrt(tkin/lowestKinEnergy); }
    219220
    220221  if (cutEnergy < tmax) {
     
    240241
    241242//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    242 /*
    243 void G4BraggModel::CorrectionsAlongStep(const G4MaterialCutsCouple* couple,
    244                                         const G4DynamicParticle* dp,
    245                                         G4double& eloss,
    246                                         G4double&,
    247                                         G4double length)
    248 {
    249   if(nuclearStopping) {
    250 
    251     G4double preKinEnergy = dp->GetKineticEnergy();
    252     G4double e = preKinEnergy - eloss*0.5;
    253     if(e < 0.0) e = preKinEnergy*0.5;
    254     G4double nloss = length*corr->NuclearDEDX(dp->GetDefinition(),
    255                                               couple->GetMaterial(),
    256                                               e,false);
    257 
    258     // too big energy loss
    259     if(eloss + nloss > preKinEnergy) {
    260       nloss *= (preKinEnergy/(eloss + nloss));
    261       eloss = preKinEnergy;
    262     } else {
    263       eloss += nloss;
    264     }
    265    
    266     G4cout << "G4ionIonisation::CorrectionsAlongStep: e= " << preKinEnergy
    267            << " de= " << eloss << " NIEL= " << nloss
    268            << " dynQ= " << dp->GetCharge()/eplus << G4endl;
    269    
    270     fParticleChange->ProposeNonIonizingEnergyDeposit(nloss);
    271   }
    272 }
    273 */
    274 
    275 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    276243
    277244void G4BraggModel::SampleSecondaries(vector<G4DynamicParticle*>* vdp,
     
    283250  G4double tmax = MaxSecondaryKinEnergy(dp);
    284251  G4double xmax = std::min(tmax, maxEnergy);
    285   if(xmin >= xmax) return;
     252  if(xmin >= xmax) { return; }
    286253
    287254  G4double kineticEnergy = dp->GetKineticEnergy();
     
    343310                                          G4double kinEnergy)
    344311{
    345   if(pd != particle) SetParticle(pd);
     312  if(pd != particle) { SetParticle(pd); }
    346313  G4double tau  = kinEnergy/mass;
    347314  G4double tmax = 2.0*electron_mass_c2*tau*(tau + 2.) /
     
    605572  G4int iNist = pstar.GetIndex(material);
    606573
    607   if( iNist >= 0 ) {
     574  if( iNist >= 0 && kineticEnergy <= 2.01*MeV) {
    608575    return pstar.GetElectronicDEDX(iNist, kineticEnergy)*material->GetDensity();
    609576
  • trunk/source/processes/electromagnetic/standard/src/G4CoulombScattering.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4CoulombScattering.cc,v 1.25 2009/10/28 10:14:13 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4CoulombScattering.cc,v 1.28 2010/05/25 18:41:12 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    5555#include "G4Electron.hh"
    5656#include "G4Proton.hh"
     57#include "G4LossTableManager.hh"
    5758
    5859//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     
    6465    isInitialised(false)
    6566{
     67  //  G4cout << "G4CoulombScattering constructor "<< G4endl;
    6668  SetBuildTableFlag(true);
    6769  SetStartFromNullFlag(false);
     
    9395void G4CoulombScattering::InitialiseProcess(const G4ParticleDefinition* p)
    9496{
     97  //G4cout << "### G4CoulombScattering::InitialiseProcess : "
     98  //     << p->GetParticleName() << G4endl;
     99  G4double a =
     100    G4LossTableManager::Instance()->FactorForAngleLimit()*CLHEP::hbarc/CLHEP::fermi;
     101  q2Max = 0.5*a*a;
     102 
    95103  // second initialisation
    96104  if(isInitialised) {
     
    98106    mod->SetPolarAngleLimit(PolarAngleLimit());
    99107    mod = GetModelByIndex(1);
    100     if(mod) mod->SetPolarAngleLimit(PolarAngleLimit());
     108    if(mod) { mod->SetPolarAngleLimit(PolarAngleLimit()); }
    101109
    102110    // first initialisation
     
    106114    G4double mass = p->GetPDGMass();
    107115    G4String name = p->GetParticleName();
     116    //G4cout << name << "  type: " << p->GetParticleType()
     117    //<< " mass= " << mass << G4endl;
    108118    if (mass > GeV || p->GetParticleType() == "nucleus") {
    109119      SetBuildTableFlag(false);
    110       verboseLevel = 0;
     120      if(name != "GenericIon") { SetVerboseLevel(0); }
    111121    } else {
    112122      if(name != "e-" && name != "e+" &&
    113123         name != "mu+" && name != "mu-" && name != "pi+" &&
    114          name != "kaon+" && name != "proton" ) verboseLevel = 0;
     124         name != "kaon+" && name != "proton" ) { SetVerboseLevel(0); }
    115125    }
    116126
     
    156166  else                              G4cout << thEnergy;
    157167
    158   if(q2Max < DBL_MAX) G4cout << "; q2Max(GeV^2)= " << q2Max/(GeV*GeV);
     168  if(q2Max < DBL_MAX) { G4cout << "; pLimit(GeV^1)= " << sqrt(q2Max)/GeV; }
    159169  G4cout << G4endl;
    160170}
  • trunk/source/processes/electromagnetic/standard/src/G4CoulombScatteringModel.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4CoulombScatteringModel.cc,v 1.44 2009/12/03 09:59:07 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4CoulombScatteringModel.cc,v 1.49 2010/05/27 14:22:05 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    4747// 09.06.08 V.Ivanchenko SelectIsotope is moved to the base class
    4848// 16.06.09 Consolandi rows 109, 111-112, 183, 185-186
     49// 27.05.10 V.Ivanchenko added G4WentzelOKandVIxSection class to
     50//              compute cross sections and sample scattering angle
    4951//
    5052//
     
    6264#include "G4IonTable.hh"
    6365#include "G4Proton.hh"
     66#include "G4NucleiProperties.hh"
    6467
    6568//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     
    8689                                G4double)
    8790{
    88   SetupParticle(p);
    89   if(kinEnergy < lowEnergyLimit) return 0.0;
    90   SetupKinematic(kinEnergy, cutEnergy);
    91 
    92   // save lab system kinematics
    93   G4double xtkin = tkin;
    94   G4double xmom2 = mom2;
    95   G4double xinvb = invbeta2;
    96 
    97   // CM system
    98   iz            = G4int(Z);
    99   G4double m2   = fNistManager->GetAtomicMassAmu(iz)*amu_c2;
    100   G4double etot = tkin + mass;
    101   G4double ptot = sqrt(mom2);
    102 
    103   G4double m12  = mass*mass;
    104   G4double momCM= ptot*m2/sqrt(m12 + m2*m2 + 2.0*etot*m2);
    105 
    106   mom2 = momCM*momCM;
    107   tkin = sqrt(mom2 + m12) - mass;
    108 
    109   //invbeta2 = 1.0 +  m12/mom2;
    110   //  G4double fm = m2/(mass + m2); 
    111 
    112   // 03.09.2009 C.Consaldi
    113   G4double Ecm=sqrt(m12 + m2*m2 + 2.0*etot*m2);
    114   G4double mu_rel=mass*m2/Ecm;
    115 
    116   invbeta2 = 1.0 +  mu_rel*mu_rel/mom2;
    117   //
    118 
    119   SetupTarget(Z, tkin);
    120 
    121   G4double xsec = CrossSectionPerAtom();
    122 
    123   // restore Lab system kinematics
    124   tkin = xtkin;
    125   mom2 = xmom2;
    126   invbeta2 = xinvb;
    127 
     91  //G4cout << "### G4CoulombScatteringModel::ComputeCrossSectionPerAtom  for "
     92  //     << p->GetParticleName()<<" Z= "<<Z<<" e(MeV)= "<< kinEnergy/MeV
     93  //     <<" cut(MeV)= " << cutEnergy<< G4endl;
     94  G4double xsec = 0.0;
     95  if(p != particle) { SetupParticle(p); }
     96  if(kinEnergy < lowEnergyLimit) { return 0.0; }
     97  DefineMaterial(CurrentCouple());
     98
     99  // Lab system
     100  G4int iz = G4int(Z);
     101  G4double etot = kinEnergy + mass;
     102  G4double m2 = fNistManager->GetAtomicMassAmu(iz)*amu_c2;
     103
     104  // 03.09.2009 C.Consaldi suggested to use relativistic reduced mass
     105  //            from publucation
     106  // A.P. Martynenko, R.N. Faustov, Teoret. mat. Fiz. 64 (1985) 179
     107  G4double Ecm  = sqrt(mass*mass + m2*m2 + 2.0*etot*m2);
     108  G4double mu_rel = mass*m2/Ecm;
     109  G4double tkin = Ecm - mu_rel;
     110  wokvi->SetRelativisticMass(mu_rel);
     111 
     112  cosTetMinNuc = wokvi->SetupKinematic(tkin, currentMaterial);
     113  if(cosThetaMax < cosTetMinNuc) {
     114    cosTetMinNuc = wokvi->SetupTarget(iz, cutEnergy);
     115    cosTetMaxNuc = cosThetaMax;
     116    if(iz == 1 && cosTetMaxNuc < 0.0 && particle == theProton) {
     117      cosTetMaxNuc = 0.0;
     118    }
     119    xsec =  wokvi->ComputeNuclearCrossSection(cosTetMinNuc, cosTetMaxNuc);
     120    elecRatio = wokvi->ComputeElectronCrossSection(cosTetMinNuc, cosThetaMax);
     121    xsec += elecRatio;
     122    if(xsec > 0.0) { elecRatio /= xsec; } 
     123  }
     124  /*
     125  G4cout << "e(MeV)= " << kinEnergy/MeV << " xsec(b)= " << xsec/barn 
     126         << "cosTetMinNuc= " << cosTetMinNuc
     127         << " cosTetMaxNuc= " << cosTetMaxNuc
     128         << " cosTetMaxElec= " << cosTetMaxElec
     129         << " screenZ= " << screenZ
     130         << " formfactA= " << formfactA << G4endl;
     131  */
    128132  return xsec;
    129133}
     
    139143{
    140144  G4double kinEnergy = dp->GetKineticEnergy();
    141   if(kinEnergy < lowEnergyLimit) return;
     145  if(kinEnergy < lowEnergyLimit) { return; }
    142146  DefineMaterial(couple);
    143147  SetupParticle(dp->GetDefinition());
    144   SetupKinematic(kinEnergy, cutEnergy);
    145148
    146149  // Choose nucleus
    147150  currentElement = SelectRandomAtom(couple,particle,
    148                                     kinEnergy,ecut,kinEnergy);
    149 
    150   G4double Z  = currentElement->GetZ();
    151   iz          = G4int(Z);
    152   G4int ia    = SelectIsotopeNumber(currentElement);
    153   G4double m2 = theParticleTable->GetIonTable()->GetNucleusMass(iz, ia);
    154 
    155   // CM system
    156   G4double etot = tkin + mass;
    157   G4double ptot = sqrt(mom2);
    158 
    159   G4double momCM= ptot*m2/sqrt(mass*mass + m2*m2 + 2.0*etot*m2);
    160   mom2 = momCM*momCM;
    161   G4double m12 = mass*mass;
    162   G4double eCM = sqrt(mom2 + m12);
    163 
    164   // a correction for heavy projectile
    165   //  G4double fm = m2/(mass + m2);
    166   //  invbeta2 = 1.0 +  m12*fm*fm/mom2;
    167 
    168   // 03.09.2009 C.Consaldi
    169   G4double Ecm=sqrt(m12 + m2*m2 + 2.0*etot*m2);
    170   G4double mu_rel=mass*m2/Ecm;
    171 
    172   invbeta2 = 1.0 +  mu_rel*mu_rel/mom2;
    173   //
    174 
    175   // sample scattering angle in CM system
    176   SetupTarget(Z, eCM - mass);
    177 
    178   G4double cost = SampleCosineTheta();
    179   G4double z1   = 1.0 - cost;
    180   if(z1 < 0.0) return;
    181   G4double sint = sqrt(z1*(1.0 + cost));
    182   G4double phi  = twopi * G4UniformRand();
     151                                    kinEnergy,cutEnergy,kinEnergy);
     152
     153  G4double Z = currentElement->GetZ();
     154  G4int iz = G4int(Z);
     155  G4int ia = SelectIsotopeNumber(currentElement);
     156  G4double targetMass = G4NucleiProperties::GetNuclearMass(ia, iz);
     157 
     158  if(ComputeCrossSectionPerAtom(particle,kinEnergy, Z,
     159                                kinEnergy, cutEnergy, kinEnergy) == 0.0)
     160    { return; }
     161
     162  G4ThreeVector newDirection =
     163    wokvi->SampleSingleScattering(cosTetMinNuc, cosTetMaxNuc, elecRatio);
    183164
    184165  // kinematics in the Lab system
    185   G4double bet  = ptot/(etot + m2);
     166  G4double etot = mass + kinEnergy;
     167  G4double ptot = sqrt(kinEnergy*(etot + mass));
     168  G4double bet  = ptot/(etot + targetMass);
    186169  G4double gam  = 1.0/sqrt((1.0 - bet)*(1.0 + bet));
    187   G4double pzCM = momCM*cost;
    188 
    189   G4ThreeVector v1(momCM*cos(phi)*sint,momCM*sin(phi)*sint,gam*(pzCM + bet*eCM));
     170  G4double eCM  = sqrt(mass*mass + targetMass*targetMass + 2*targetMass*etot);
     171  G4double pCM  = ptot*targetMass/eCM;
     172  G4double e1   = sqrt(mass*mass + pCM*pCM);
     173
     174  newDirection *= pCM;
     175
     176  G4ThreeVector v1(newDirection.x(),newDirection.y(),gam*(newDirection.z() + bet*e1));
     177  G4double finalT = gam*(e1 + bet*newDirection.z()) - mass;
     178  newDirection = v1.unit();
     179
    190180  G4ThreeVector dir = dp->GetMomentumDirection();
    191   G4ThreeVector newDirection = v1.unit();
    192181  newDirection.rotateUz(dir);   
    193182  fParticleChange->ProposeMomentumDirection(newDirection);   
    194 
    195  //   G4double elab = gam*(eCM + bet*pzCM);
    196 
    197  // G4double Ecm  = sqrt(mass*mass + m2*m2 + 2.0*etot*m2);
    198   G4double elab = etot - m2*(ptot/Ecm)*(ptot/Ecm)*(1.-cost) ;
    199 
    200183 
    201   G4double finalT = elab - mass;
    202   if(finalT < 0.0) finalT = 0.0;
     184  // recoil
     185  G4double trec = kinEnergy - finalT;
     186  if(finalT <= lowEnergyLimit) {
     187    trec = kinEnergy; 
     188    finalT = 0.0;
     189  }
     190   
    203191  fParticleChange->SetProposedKineticEnergy(finalT);
    204192
    205   // recoil
    206   G4double erec = kinEnergy - finalT;
     193  //  G4cout << "sint= " << sint << " Erec(eV)= " << erec/eV << G4endl;
    207194
    208195  G4double tcut = recoilThreshold;
    209196  if(pCuts) { tcut= std::max(tcut,(*pCuts)[currentMaterialIndex]); }
    210 
    211   if(erec > tcut) {
     197  /* 
     198  G4cout << "sint= " << sint << " Erec(eV)= " << erec/eV
     199         << " tcut(eV)= " << tcut/eV << " th(eV)= " << recoilThreshold/eV
     200         << " cut(eV)= " << (*pCuts)[currentMaterialIndex]/eV
     201         << "  "  << fvect->size()
     202         << G4endl;
     203  */
     204  if(trec > tcut) {
    212205    G4ParticleDefinition* ion = theParticleTable->FindIon(iz, ia, 0, iz);
    213206    G4double plab = sqrt(finalT*(finalT + 2.0*mass));
    214207    G4ThreeVector p2 = (ptot*dir - plab*newDirection).unit();
    215     G4DynamicParticle* newdp  = new G4DynamicParticle(ion, p2, erec);
     208    G4DynamicParticle* newdp  = new G4DynamicParticle(ion, p2, trec);
    216209    fvect->push_back(newdp);
    217   } else if(erec > 0.0) {
    218     fParticleChange->ProposeLocalEnergyDeposit(erec);
    219     fParticleChange->ProposeNonIonizingEnergyDeposit(erec);
     210  } else if(trec > 0.0) {
     211    fParticleChange->ProposeLocalEnergyDeposit(trec);
     212    fParticleChange->ProposeNonIonizingEnergyDeposit(trec);
    220213  }
    221214}
  • trunk/source/processes/electromagnetic/standard/src/G4GoudsmitSaundersonMscModel.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4GoudsmitSaundersonMscModel.cc,v 1.20 2009/12/16 17:50:11 gunter Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4GoudsmitSaundersonMscModel.cc,v 1.24 2010/05/17 15:11:30 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    5151//                     assuming the case of lambdan<1 as single scattering regime
    5252//                     tuning theta sampling for theta below the screening angle
     53// 08.02.2010 O.Kadri: bugfix in compound xsection calculation and small angle computation
     54//                     adding a rejection condition to hard collision angular sampling
     55//                     ComputeTruePathLengthLimit was taken from G4WentzelVIModel
     56// 26.03.2010 O.Kadri: direct xsection calculation not inverse of the inverse
     57//                     angular sampling without large angle rejection method
     58//                     longitudinal displacement is computed exactly from <z>
     59// 12.05.2010 O.Kadri: exchange between target and projectile has as a condition the particle type (e-/e-)
     60//                     some cleanup to minimize time consuming (adding lamdan12 & Qn12, changing the error to 1.0e-12 for scrA)
    5361//
    5462//
     
    6068//Ref.4:Bielajew et al.,".....", NIMB 173 (2001) 332-343;
    6169//Ref.5:F. Salvat et al.,"ELSEPA--Dirac partial ...molecules", Comp.Phys.Comm.165 (2005) pp 157-190;
    62 //Ref.6:G4UrbanMscModel G4_v9.1Ref09;
    63 //Ref.7:G4eCoulombScatteringModel G4_v9.1Ref09.
    64 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    65 
     70//Ref.6:G4UrbanMscModel G4 9.2;
     71//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    6672#include "G4GoudsmitSaundersonMscModel.hh"
    6773#include "G4GoudsmitSaundersonTable.hh"
     
    7783#include "G4PhysicsTable.hh"
    7884#include "Randomize.hh"
    79 #include "G4Poisson.hh"
    8085
    8186using namespace std;
     
    128133                       G4double kineticEnergy,G4double Z, G4double, G4double, G4double)
    129134
    130   //Build cross section table : Taken from Ref.7
    131135  G4double cs=0.0;
    132136  G4double kinEnergy = kineticEnergy;
     
    134138  if(kinEnergy>highKEnergy)kinEnergy=highKEnergy;
    135139
    136   G4double value0,value1;
    137   CalculateIntegrals(p,Z,kinEnergy,value0,value1);
     140  G4double cs0;
     141  CalculateIntegrals(p,Z,kinEnergy,cs0,cs);
    138142 
    139   if(value1 > 0.0) cs = 1./value1;
    140 
    141143  return cs;
    142144
     
    148150{   
    149151  G4double kineticEnergy = dynParticle->GetKineticEnergy();
    150   if((kineticEnergy <= 0.0) || (tPathLength <= tlimitminfix)) return ;
    151 
    152   G4double cosTheta1,sinTheta1,cosTheta2,sinTheta2;
    153   G4double phi1,phi2,cosPhi1=1.0,sinPhi1=0.0,cosPhi2=1.0,sinPhi2=0.0;
    154   G4double q1,Gamma,Eta,delta,nu,nu0,nu1,nu2;
     152  if((kineticEnergy <= 0.0) || (tPathLength <= tlimitminfix)||
     153     (tPathLength/tausmall < lambda1)) return ;
    155154
    156155  ///////////////////////////////////////////
    157   // Effective energy and path-length from Eq. 4.7.15+16 of Ref.4
     156  // Effective energy
    158157  G4double  eloss = theManager->GetEnergy(particle,tPathLength,currentCouple);
    159   if(eloss>0.5*kineticEnergy)eloss=kineticEnergy-eloss;//exchange possibility between target atomic e- and incident particle
     158  if(eloss>0.5*kineticEnergy)
     159   {if((dynParticle->GetCharge())==-eplus)eloss=kineticEnergy-eloss;//exchange between target and projectile if they are electrons
     160    else eloss=0.5*kineticEnergy;
     161   }
    160162  G4double ee       = kineticEnergy - 0.5*eloss;
    161163  G4double ttau     = ee/electron_mass_c2;
     
    166168  kineticEnergy *= (1 - cst1);
    167169  ///////////////////////////////////////////
    168   // additivity rule for mixture and compound xsection calculation
     170  // additivity rule for mixture and compound xsection's
    169171  const G4Material* mat = currentCouple->GetMaterial();
     172  const G4ElementVector* theElementVector = mat->GetElementVector();
     173  const G4double* theAtomNumDensityVector = mat->GetVecNbOfAtomsPerVolume();
    170174  G4int nelm = mat->GetNumberOfElements();
    171   const G4ElementVector* theElementVector = mat->GetElementVector();
    172   const G4double* theFraction = mat->GetFractionVector();
    173   G4double atomPerVolume = mat->GetTotNbOfAtomsPerVolume();
    174   G4double llambda0=0.,llambda1=0.;
     175  G4double s0,s1;
     176  lambda0=0.;
    175177  for(G4int i=0;i<nelm;i++)
    176     {
    177       G4double l0,l1;
    178       CalculateIntegrals(particle,(*theElementVector)[i]->GetZ(),kineticEnergy,l0,l1);
    179       llambda0 += (theFraction[i]/l0);
    180       llambda1 += (theFraction[i]/l1);
     178    {
     179      CalculateIntegrals(particle,(*theElementVector)[i]->GetZ(),kineticEnergy,s0,s1);
     180      lambda0 += (theAtomNumDensityVector[i]*s0);
    181181    }
    182   if(llambda0>DBL_MIN) llambda0 =1./llambda0;
    183   if(llambda1>DBL_MIN) llambda1 =1./llambda1;
     182  if(lambda0>DBL_MIN) lambda0 =1./lambda0;
     183
     184// Newton-Raphson root's finding method of scrA from:
     185// Sig1(PWA)/Sig0(PWA)=g1=2*scrA*((1+scrA)*log(1+1/scrA)-1)
    184186  G4double g1=0.0;
    185   if(llambda1>DBL_MIN) g1 = llambda0/llambda1;
    186 
    187   G4double x1,x0;
    188   x0=g1/2.;
     187  if(lambda1>DBL_MIN) g1 = lambda0/lambda1;
     188
     189  G4double logx0,x1,delta;
     190  G4double x0=g1/2.;
    189191  do
    190192    { 
    191       x1 = x0-(x0*((1.+x0)*log(1.+1./x0)-1.0)-g1/2.)/( (1.+2.*x0)*log(1.+1./x0)-2.0);// x1=x0-f(x0)/f'(x0)
     193      logx0=std::log(1.+1./x0);
     194      x1 = x0-(x0*((1.+x0)*logx0-1.0)-g1/2.)/( (1.+2.*x0)*logx0-2.0);
    192195      delta = std::abs( x1 - x0 );   
    193       x0 = x1;  // new approximation becomes the old approximation for the next iteration
    194     } while (delta > 1e-10);
     196      x0 = x1;
     197    } while (delta > 1.0e-12);
    195198  G4double scrA = x1;
    196199
    197   G4double us=0.0,vs=0.0,ws=1.0,x_coord=0.0,y_coord=0.0,z_coord=1.0;
    198200  G4double lambdan=0.;
    199   G4bool mscatt=false,noscatt=false;
    200 
    201   if(llambda0>0.)lambdan=atomPerVolume*tPathLength/llambda0;
    202   if((lambdan<=1.0e-12))return;
    203 
     201
     202  if(lambda0>0.)lambdan=tPathLength/lambda0;
     203  if(lambdan<=1.0e-12)return;
     204  G4double lambdan12=0.5*lambdan;
     205  Qn1 = lambdan *g1;//2.* lambdan *scrA*((1.+scrA)*log(1.+1./scrA)-1.);
     206  Qn12 = 0.5*Qn1;
     207 
     208  G4double cosTheta1,sinTheta1,cosTheta2,sinTheta2;
     209  G4double cosPhi1=1.0,sinPhi1=0.0,cosPhi2=1.0,sinPhi2=0.0;
     210  G4double us=0.0,vs=0.0,ws=1.0,wss=0.,x_coord=0.0,y_coord=0.0,z_coord=1.0;
     211 
    204212  G4double epsilon1=G4UniformRand();
    205   G4double expn = exp(-lambdan);
    206   if((epsilon1<expn)||insideskin)// no scattering
    207     {noscatt=true;}
    208   else if((epsilon1<((1.+lambdan)*expn)||(lambdan<1.)))
    209     {
    210       mscatt=false;
    211       ws=G4UniformRand();
    212       ws= 1.-2.*scrA*ws/(1.-ws + scrA);
    213       if(acos(ws)<sqrt(scrA))//small angle approximation for theta less than screening angle
    214       {G4int i=0;
    215       do{i++;
    216       ws=1.+0.5*atomPerVolume*tPathLength*log(G4UniformRand())/llambda1;
    217       }while((fabs(ws)>1.)&&(i<20));//i<20 to avoid time consuming during the run
    218       if(i==19)ws=cos(sqrt(scrA));
    219       }
    220       G4double phi0=twopi*G4UniformRand();
    221       us=sqrt(1.-ws*ws)*cos(phi0);
    222       vs=sqrt(1.-ws*ws)*sin(phi0);
    223       G4double rr=G4UniformRand();
    224       x_coord=(rr*us);
    225       y_coord=(rr*vs);
    226       z_coord=((1.-rr)+rr*ws);
    227     }
    228   else
    229     {
    230       mscatt=true;
     213  G4double expn = std::exp(-lambdan);
     214  if(epsilon1<expn)// no scattering
     215    {return;}
     216  else if((epsilon1<((1.+lambdan)*expn))||(lambdan<1.))//single scattering (Rutherford DCS's)
     217    {
     218
     219      G4double xi=G4UniformRand();
     220      xi= 2.*scrA*xi/(1.-xi + scrA);   
     221      if(xi<0.)xi=0.;
     222      else if(xi>2.)xi=2.;
     223      ws=1.-xi;
     224      wss=std::sqrt(xi*(2.-xi));     
     225      G4double phi0=CLHEP::twopi*G4UniformRand();
     226      us=wss*cos(phi0);
     227      vs=wss*sin(phi0);
     228    }
     229  else // multiple scattering
     230    {
    231231      // Ref.2 subsection 4.4 "The best solution found"
    232232      // Sample first substep scattering angle
    233       SampleCosineTheta(0.5*lambdan,scrA,cosTheta1,sinTheta1);
    234       phi1  = twopi*G4UniformRand();
     233      SampleCosineTheta(lambdan12,scrA,cosTheta1,sinTheta1);
     234      G4double phi1  = CLHEP::twopi*G4UniformRand();
    235235      cosPhi1 = cos(phi1);
    236236      sinPhi1 = sin(phi1);
    237237
    238238      // Sample second substep scattering angle
    239       SampleCosineTheta(0.5*lambdan,scrA,cosTheta2,sinTheta2);
    240       phi2  = twopi*G4UniformRand();
     239      SampleCosineTheta(lambdan12,scrA,cosTheta2,sinTheta2);
     240      G4double phi2  = CLHEP::twopi*G4UniformRand();
    241241      cosPhi2 = cos(phi2);
    242242      sinPhi2 = sin(phi2);
    243243
    244       // Scattering direction
     244      // Overall scattering direction
    245245      us = sinTheta2*(cosTheta1*cosPhi1*cosPhi2 - sinPhi1*sinPhi2) + cosTheta2*sinTheta1*cosPhi1;
    246246      vs = sinTheta2*(cosTheta1*sinPhi1*cosPhi2 + cosPhi1*sinPhi2) + cosTheta2*sinTheta1*sinPhi1;
    247247      ws = cosTheta1*cosTheta2 - sinTheta1*sinTheta2*cosPhi2;
     248      G4double sqrtA=sqrt(scrA);
     249      if(acos(ws)<sqrtA)//small angle approximation for theta less than screening angle
     250      {
     251       G4int i=0;
     252       do{i++;
     253       ws=1.+Qn12*log(G4UniformRand());
     254       }while((fabs(ws)>1.)&&(i<20));//i<20 to avoid time consuming during the run
     255       if(i>=19)ws=cos(sqrtA);
     256
     257       wss=std::sqrt((1.-ws)*(1.0+ws));     
     258       us=wss*cos(phi1);
     259       vs=wss*sin(phi1);
     260     }
    248261    }
    249262   
     
    253266  fParticleChange->ProposeMomentumDirection(newDirection);
    254267 
    255   if((safety > tlimitminfix)&&(latDisplasment))
    256     { 
    257 
    258       if(mscatt)
    259         {
    260           if(scrA<DBL_MIN)scrA=DBL_MIN;
    261           if(llambda1<DBL_MIN)llambda1=DBL_MIN;
    262           q1 = 2.*scrA*((1. + scrA)*log(1. + 1./scrA) - 1.);
    263           if(q1<DBL_MIN)q1=DBL_MIN;
    264           Gamma  = 6.*scrA*(1. + scrA)*((1. + 2.*scrA)*log(1. + 1./scrA) - 2.)/q1;
    265           Eta    = atomPerVolume*tPathLength/llambda1;     
    266           delta  = 0.90824829 - Eta*(0.102062073-Gamma*0.026374715);
    267 
    268           nu = G4UniformRand();
    269           nu = std::sqrt(nu);
    270           nu0 = (1.0 - nu)/2.;
    271           nu1 = nu*delta;
    272           nu2 = nu*(1.0-delta);
    273           x_coord=(nu1*sinTheta1*cosPhi1+nu2*sinTheta2*(cosPhi1*cosPhi2-cosTheta1*sinPhi1*sinPhi2)+nu0*us);
    274           y_coord=(nu1*sinTheta1*sinPhi1+nu2*sinTheta2*(sinPhi1*cosPhi2+cosTheta1*cosPhi1*sinPhi2)+nu0*vs);
    275           z_coord=(nu0+nu1*cosTheta1+nu2*cosTheta2+ nu0*ws)  ;
    276         }
    277 
     268  if((safety > tlimitminfix)&&latDisplasment)
     269    {
     270      if(Qn1<0.02)// corresponding to error less than 1% in the exact formula of <z>
     271      z_coord = 1.0 - Qn1*(0.5 - Qn1/6.);
     272      else z_coord = (1.-std::exp(-Qn1))/Qn1;
     273
     274      G4double rr=std::sqrt((1.- z_coord*z_coord)/(1.-ws*ws));
     275      x_coord = rr*us;
     276      y_coord = rr*vs;
    278277      // displacement is computed relatively to the end point
    279       if(!noscatt)z_coord -= 1.0;//for noscatt zcoord z_coord !=0.
    280       G4double rr = sqrt(x_coord*x_coord+y_coord*y_coord+z_coord*z_coord);
     278      z_coord -= 1.0;
     279      rr = std::sqrt(x_coord*x_coord+y_coord*y_coord+z_coord*z_coord);
    281280      G4double r  = rr*zPathLength;
    282281      /*
     
    287286             << G4endl;
    288287      */
     288      if(tPathLength<=zPathLength)return;
    289289      if(r > tlimitminfix) {
    290290
    291         G4ThreeVector latDirection(x_coord/rr,y_coord/rr,z_coord/rr);
    292         latDirection.rotateUz(oldDirection);
    293 
    294         ComputeDisplacement(fParticleChange, latDirection, r, safety);
     291        G4ThreeVector Direction(x_coord/rr,y_coord/rr,z_coord/rr);
     292        Direction.rotateUz(oldDirection);
     293
     294        ComputeDisplacement(fParticleChange, Direction, r, safety);
    295295      }     
    296296    }
     
    303303                                                G4double &cost, G4double &sint)
    304304{
    305   G4double u,Qn1,r1,tet;
    306305  G4double xi=0.;
    307   Qn1=2.* lambdan *scrA*((1.+scrA)*log(1.+1./scrA)-1.);
    308 
    309 if (Qn1<0.001)xi=-0.5*Qn1*log(G4UniformRand());
    310 else if(Qn1>0.5)xi=2.*G4UniformRand();//isotropic distribution
    311 else
    312 {
    313       // procedure described by Benedito in Ref.1
     306 
     307  if (Qn12<0.001) 
     308  {G4double r1,tet;
    314309      do{
    315         r1=G4UniformRand();
    316         u=GSTable->SampleTheta(lambdan,scrA,G4UniformRand());
    317         xi = 2.*u;
    318         tet=acos(1.-xi);
     310        r1=G4UniformRand();
     311        xi=-Qn12*log(G4UniformRand());
     312        tet=acos(1.-xi);
    319313      }while(tet*r1*r1>sin(tet));
    320 }
     314  }
     315  else if(Qn12>0.5)xi=2.*G4UniformRand();
     316  else xi=2.*(GSTable->SampleTheta(lambdan,scrA,G4UniformRand()));
     317
    321318
    322319  if(xi<0.)xi=0.;
    323   if(xi>2.)xi=2.;
     320  else if(xi>2.)xi=2.;
     321
    324322  cost=(1. - xi);
    325323  sint=sqrt(xi*(2.-xi));
     
    333331void
    334332G4GoudsmitSaundersonMscModel::CalculateIntegrals(const G4ParticleDefinition* p,G4double Z,
    335                                                  G4double kinEnergy,G4double &Lam0,
    336                                                  G4double &Lam1)
     333                                                 G4double kinEnergy,G4double &Sig0,
     334                                                 G4double &Sig1)
    337335{
    338   G4double summ00=0.0;
    339   G4double summ10=0.0;
    340336  G4double x1,x2,y1,y2,acoeff,bcoeff;
    341337  G4double kineticE = kinEnergy;
     
    343339  if(kineticE>highKEnergy)kineticE=highKEnergy;
    344340  kineticE /= eV;
    345   G4double logE=log(kineticE);
     341  G4double logE=std::log(kineticE);
    346342 
    347343  G4int  iZ = G4int(Z);
     
    349345
    350346  G4int enerInd=0;
    351   for(G4int i=1;i<106;i++)
     347  for(G4int i=0;i<105;i++)
    352348  {
    353349  if((logE>=ener[i])&&(logE<ener[i+1])){enerInd=i;break;}
     
    364360        acoeff=(y2-y1)/(x2*x2-x1*x1);
    365361        bcoeff=y2-acoeff*x2*x2;
    366         summ00=acoeff*logE*logE+bcoeff;
    367         summ00 =exp(summ00);
     362        Sig0=acoeff*logE*logE+bcoeff;
     363        Sig0 =std::exp(Sig0);
    368364        y1=FTCSE[iZ-1][enerInd];
    369365        y2=FTCSE[iZ-1][enerInd+1];
    370366        acoeff=(y2-y1)/(x2*x2-x1*x1);
    371367        bcoeff=y2-acoeff*x2*x2;
    372         summ10=acoeff*logE*logE+bcoeff;
    373         summ10 =exp(summ10);
     368        Sig1=acoeff*logE*logE+bcoeff;
     369        Sig1=std::exp(Sig1);
    374370      }
    375371    else  //Interpolation of the form y=ax+b
     
    379375        y1=TCSE[iZ-1][104];
    380376        y2=TCSE[iZ-1][105];
    381         summ00=(y2-y1)*(logE-x1)/(x2-x1)+y1;
    382         summ00 =exp(summ00);
     377        Sig0=(y2-y1)*(logE-x1)/(x2-x1)+y1;
     378        Sig0=std::exp(Sig0);
    383379        y1=FTCSE[iZ-1][104];
    384380        y2=FTCSE[iZ-1][105];
    385         summ10=(y2-y1)*(logE-x1)/(x2-x1)+y1;
    386         summ10 =exp(summ10);
     381        Sig1=(y2-y1)*(logE-x1)/(x2-x1)+y1;
     382        Sig1=std::exp(Sig1);
    387383      }
    388384    }
     
    397393        acoeff=(y2-y1)/(x2*x2-x1*x1);
    398394        bcoeff=y2-acoeff*x2*x2;
    399         summ00=acoeff*logE*logE+bcoeff;
    400         summ00 =exp(summ00);
     395        Sig0=acoeff*logE*logE+bcoeff;
     396        Sig0 =std::exp(Sig0);
    401397        y1=FTCSP[iZ-1][enerInd];
    402398        y2=FTCSP[iZ-1][enerInd+1];
    403399        acoeff=(y2-y1)/(x2*x2-x1*x1);
    404400        bcoeff=y2-acoeff*x2*x2;
    405         summ10=acoeff*logE*logE+bcoeff;
    406         summ10 =exp(summ10);
     401        Sig1=acoeff*logE*logE+bcoeff;
     402        Sig1=std::exp(Sig1);
    407403      }
    408404    else
     
    412408        y1=TCSP[iZ-1][104];
    413409        y2=TCSP[iZ-1][105];
    414         summ00=(y2-y1)*(logE-x1)/(x2-x1)+y1;
    415         summ00 =exp(summ00);
     410        Sig0=(y2-y1)*(logE-x1)/(x2-x1)+y1;
     411        Sig0 =std::exp(Sig0);
    416412        y1=FTCSP[iZ-1][104];
    417413        y2=FTCSP[iZ-1][105];
    418         summ10=(y2-y1)*(logE-x1)/(x2-x1)+y1;
    419         summ10 =exp(summ10);
     414        Sig1=(y2-y1)*(logE-x1)/(x2-x1)+y1;
     415        Sig1=std::exp(Sig1);
    420416      }
    421417    }
    422418   
    423   summ00 *=barn;
    424   summ10 *=barn;
    425 
    426   Lam0=1./((1.+1./Z)*summ00);
    427   Lam1=1./((1.+1./Z)*summ10);
    428 
    429 }
    430 
    431 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    432 //t->g->t step transformations taken from Ref.6
     419  Sig0 *= barn;
     420  Sig1 *= barn;
     421
     422}
     423
     424//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     425//t->g->t step transformations taken from Ref.6
    433426
    434427G4double
     
    635628
    636629//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    637 
     630// taken from Ref.6
    638631G4double G4GoudsmitSaundersonMscModel::ComputeGeomPathLength(G4double)
    639632{
     
    688681  if(samplez) {
    689682
    690     const G4double  ztmax = 0.99, onethird = 1./3. ;
     683    const G4double  ztmax = 0.99;
    691684    G4double zt = zmean/tPathLength ;
    692685
     
    694687
    695688      G4double u,cz1;
    696       if(zt >= onethird) {
     689      if(zt >= 0.333333333) {
    697690
    698691        G4double cz = 0.5*(3.*zt-1.)/(1.-zt) ;
     
    719712
    720713//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    721 
     714// taken from Ref.6
    722715G4double
    723716G4GoudsmitSaundersonMscModel::ComputeTrueStepLength(G4double geomStepLength)
  • trunk/source/processes/electromagnetic/standard/src/G4GoudsmitSaundersonTable.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4GoudsmitSaundersonTable.cc,v 1.4 2009/08/28 16:36:52 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4GoudsmitSaundersonTable.cc,v 1.7 2010/05/17 15:11:30 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    3939// Modifications:
    4040// 04.03.2009 V.Ivanchenko cleanup and format according to Geant4 EM style
    41 // 26.08.2009 O.Kadri: avoiding unuseful calculations and optimizing the root finding parameter error's
    42 //                     within SampleTheta method
    43 //
     41// 26.08.2009 O.Kadri: avoiding unuseful calculations and optimizing the root
     42//                     finding parameter error's within SampleTheta method
     43// 08.02.2010 O.Kadri: reduce delared variables; reduce error of finding root
     44//                     in secant method
     45// 26.03.2010 O.Kadri: minimum of used arrays in computation within the dichotomie
     46//                     finding method the error was the lowest value of uvalues
     47// 12.05.2010 O.Kadri: changing of sqrt((b-a)*(b-a)) with fabs(b-a)
     48//
     49
    4450//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    4551 
     
    200206  //Benedito's procedure
    201207  G4double A[11],ThisPDF[320],ThisCPDF[320];
    202   G4double PDF1[320],PDF2[320],PDF3[320],PDF4[320],CPDF1[320],CPDF2[320],CPDF3[320],CPDF4[320];
    203   G4double coeff,Ckj,CkjPlus1,CkPlus1j,CkPlus1jPlus1,aa,b,m,F;
    204   G4int Ind0,Ind1,Ind2,Ind3,KIndex=0,JIndex=0,IIndex=0;
     208  G4double coeff,Ckj,CkjPlus1,CkPlus1j,CkPlus1jPlus1,a,b,m,F;
     209  G4int Ind0,KIndex=0,JIndex=0,IIndex=0;
     210
    205211
    206212  ///////////////////////////////////////////////////////////////////////////
     
    220226  // Calculate Interpolated PDF and CPDF arrays
    221227  Ind0=320*(11*KIndex+JIndex);
    222   Ind1=320*(11*KIndex+JIndex+1);
    223   Ind2=320*(11*(KIndex+1)+JIndex);
    224   Ind3=320*(11*(KIndex+1)+JIndex+1);
    225228  for(G4int i=0 ; i<320 ;i++){
    226     PDF1[i]=PDF[Ind0+i];PDF2[i]=PDF[Ind1+i];   
    227     PDF3[i]=PDF[Ind2+i];PDF4[i]=PDF[Ind3+i];   
    228     CPDF1[i]=CPDF[Ind0+i];CPDF2[i]=CPDF[Ind1+i];   
    229     CPDF3[i]=CPDF[Ind2+i];CPDF4[i]=CPDF[Ind3+i]; 
    230     ThisPDF[i]=Ckj*PDF1[i]+CkjPlus1*PDF2[i]+CkPlus1j*PDF3[i]+CkPlus1jPlus1*PDF4[i];
    231     ThisCPDF[i]=Ckj*CPDF1[i]+CkjPlus1*CPDF2[i]+CkPlus1j*CPDF3[i]+CkPlus1jPlus1*CPDF4[i]; 
     229    ThisPDF[i]=Ckj*PDF[Ind0]+CkjPlus1*PDF[Ind0+320]+CkPlus1j*PDF[Ind0+3520]+CkPlus1jPlus1*PDF[Ind0+3840];
     230    ThisCPDF[i]=Ckj*CPDF[Ind0]+CkjPlus1*CPDF[Ind0+320]+CkPlus1j*CPDF[Ind0+3520]+CkPlus1jPlus1*CPDF[Ind0+3840]; 
    232231  // Find u Index using secant method
    233   if((i!=0)&&((rndm>=ThisCPDF[i-1])&&(rndm<ThisCPDF[i])))  {IIndex=i-1;break;}
     232    if((i!=0)&&((rndm>=ThisCPDF[i-1])&&(rndm<ThisCPDF[i])))  {IIndex=i-1;break;}
     233    Ind0++;
    234234  }
    235235
    236236  ///////////////////////////////////////////////////////////////////////////
    237237  //CPDF^-1(rndm)=x ==> CPDF(x)=rndm;
    238   aa=uvalues[IIndex];
     238  a=uvalues[IIndex];
    239239  b=uvalues[IIndex+1];
    240240 
    241241  do{
    242     m=0.5*(aa+b);
     242    m=0.5*(a+b);
    243243    F=(ThisCPDF[IIndex]+(m-uvalues[IIndex])*ThisPDF[IIndex]
    244244       +((m-uvalues[IIndex])*(m-uvalues[IIndex])*(ThisPDF[IIndex+1]-ThisPDF[IIndex]))
    245245       /(2.*(uvalues[IIndex+1]-uvalues[IIndex])))-rndm;
    246246    if(F>0.)b=m;
    247     else aa=m;
    248   } while(sqrt((b-aa)*(b-aa))>1.0e-6);
     247    else a=m;
     248  } while(fabs(b-a)>1.0e-9);
    249249
    250250  return m;
  • trunk/source/processes/electromagnetic/standard/src/G4MollerBhabhaModel.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4MollerBhabhaModel.cc,v 1.35 2009/11/09 19:16:13 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4MollerBhabhaModel.cc,v 1.38 2010/04/06 17:10:16 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    9292
    9393G4double G4MollerBhabhaModel::MinEnergyCut(const G4ParticleDefinition*,
    94                                            const G4MaterialCutsCouple* couple)
    95 {
    96   G4double electronDensity = couple->GetMaterial()->GetElectronDensity();
    97   G4double Zeff  = electronDensity/couple->GetMaterial()->GetTotNbOfAtomsPerVolume();
    98   return 0.25*sqrt(Zeff)*keV;
     94                                           const G4MaterialCutsCouple* /*couple*/)
     95{
     96  //  G4double electronDensity = couple->GetMaterial()->GetElectronDensity();
     97  //G4double Zeff  = electronDensity/couple->GetMaterial()->GetTotNbOfAtomsPerVolume();
     98  //return 0.25*sqrt(Zeff)*keV;
     99  //return couple->GetMaterial()->GetIonisation()->GetMeanExcitationEnergy();
     100  return 0.1*keV;
    99101}
    100102
  • trunk/source/processes/electromagnetic/standard/src/G4PAIModel.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4PAIModel.cc,v 1.51 2009/08/12 21:28:50 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4PAIModel.cc,v 1.52 2010/06/03 07:28:39 grichine Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    3232// File name:     G4PAIModel.cc
    3333//
    34 // Author: Vladimir.Grichine@cern.ch on base of Vladimir Ivanchenko code
     34// Author: Vladimir.Grichine@cern.ch on base of Vladimir Ivanchenko model interface
    3535//
    3636// Creation date: 05.10.2003
     
    148148                            const G4DataVector&)
    149149{
     150  G4cout<<"G4PAIModel::Initialise for "<<p->GetParticleName()<<G4endl;
    150151  if(isInitialised) return;
    151152  isInitialised = true;
  • trunk/source/processes/electromagnetic/standard/src/G4PAIPhotonModel.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4PAIPhotonModel.cc,v 1.23 2009/07/26 15:51:01 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4PAIPhotonModel.cc,v 1.24 2010/06/03 07:28:39 grichine Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    161161                                   const G4DataVector&)
    162162{
     163  G4cout<<"G4PAIPhotonModel::Initialise for "<<p->GetParticleName()<<G4endl;
    163164  if(isInitialised) return;
    164165  isInitialised = true;
  • trunk/source/processes/electromagnetic/standard/src/G4PSTARStopping.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4PSTARStopping.cc,v 1.8 2008/11/24 18:28:09 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4PSTARStopping.cc,v 1.14 2010/04/26 17:40:34 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828
    2929//---------------------------------------------------------------------------
     
    3939// Contract:            CSMAN-5288
    4040//
    41 // Modifications:
     41// Modifications: 
     42// 25.04.2010 V.Ivanchenko introduce G4LPhysicsFreeVector
     43// 26.04.2010 A.Ivanchenko fixed data for G4_PROPANE and G4_Pt,
     44//                         checked all data
    4245//
    4346//----------------------------------------------------------------------------
     
    5356G4PSTARStopping::G4PSTARStopping()
    5457{
    55   currentE = 0.0;
    5658  currentMaterial = 0;
    57   index = 0;
    5859  matIndex = -1;
     60
     61  name.resize(74,"");
     62  sdata.resize(74,0);
     63
    5964  Initialise();
    6065}
     
    6368
    6469G4PSTARStopping::~G4PSTARStopping()
    65 {}
     70{
     71  for(size_t i=0; i<74; ++i) { delete sdata[i]; }
     72}
    6673
    6774//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     
    7178  if (mat == currentMaterial) return matIndex;
    7279  G4String matName = mat->GetName();
    73   for (G4int i=0; i<74; i++){
     80  for (G4int i=0; i<74; ++i){
    7481    if (matName == name[i]){
    7582      matIndex = i;
     
    8592G4double G4PSTARStopping::GetElectronicDEDX(G4int i, G4double energy)
    8693{
    87   if (matIndex == i && energy == currentE) return res;       
    88 
     94  G4double res = 0.0;
    8995  if (i<0 || i>73){
    9096    G4cout << "### G4PSTARStopping WARNING: index "
    9197           << i << " is out of range!" << G4endl;
    92     res = 0.0;
    9398    return res;
    9499  }
    95   matIndex = i;
    96   currentE = energy;
    97 
    98   if (energy < kinE[index] || energy > kinE[index+1]){
    99 
    100     if (energy <= kinE[0]) {
    101       index = 0;
    102       res = e[matIndex][0]*std::sqrt(energy/kinE[0]);
    103       return res;
    104     } else if (energy >= kinE[59]) {
    105       index = 58;
    106       res = e[matIndex][59];
    107       return res;
    108     }
    109     for (index = 0; index<59; index++){if (energy <= kinE[index+1]) break;}
    110   }
    111 
    112   G4double t1 = kinE[index];
    113   G4double t2 = kinE[index+1];
    114   G4double e1 = e[matIndex][index];
    115   G4double e2 = e[matIndex][index+1];
    116   res = e1*std::exp(std::log(energy/t1)*std::log(e2/e1)/std::log(t2/t1));
     100  if(energy < emin) { res = (*(sdata[i]))[0]*std::sqrt(energy/emin); }
     101  else              { res = sdata[i]->Value(energy); }
    117102  return res;
    118103}
     
    120105void G4PSTARStopping::Initialise()
    121106{
    122   G4int i;
    123  
    124107  name [0] = "G4_A-150_TISSUE";
    125108  G4double T0[60] = {
     
    129112    0.085, 0.09,   0.095, 0.1,    0.125, 0.15,  0.175,   0.2, 0.225, 0.25,
    130113    0.275, 0.3,    0.35,  0.4,    0.45,  0.5,    0.55,   0.6, 0.65,  0.7,
    131     0.75,  0.8,    0.85,  0.9,    0.95,  1.,     1.25,   1.5, 1.75,  2. };
     114    0.75,  0.8,    0.85,  0.9,    0.95,  1.,     1.25,   1.5, 1.75,  2. };
     115  emin = T0[0]*MeV;
     116 
    132117  G4double e0[60] = { 176.8, 216.6, 250.1, 279.6, 306.3, 351.1, 390.9, 426.8, 459.8, 489.9, 517.8, 544, 596.4, 641.3, 680.6, 715.7, 747, 775, 800, 822.6, 861.7, 894.2, 920.7, 941.5, 957.3, 968.6, 976.2, 980.5, 982, 981, 978, 973.2, 967, 959.5, 910.4, 853.6, 797.9, 746.9, 701.5, 661.5, 626.4, 595.6, 544.8, 504.4, 471.1, 442.8, 416.4, 392, 369.9, 350, 332.2, 316.4, 302.2, 289.5, 278.1, 267.9, 228.9, 200.8, 179.5, 162.6 };
    133118 
    134   for(i=0; i<60; i++) {e[0][i]=e0[i]*MeV*cm2/g;}
    135   for(i=0; i<60; i++) {kinE[i]=T0[i]*MeV;}
     119  AddData(T0, e0, 0);
    136120 
    137121  name [1] = "G4_ACETYLENE";
    138122  G4double e1[60] = { 185.5, 227.2, 262.3, 293.2, 321.2, 364.8, 404, 439.3, 471.6, 500.3, 526.4, 550.6, 600.2, 641.6, 677.4, 709.2, 737.3, 762, 783.7, 803.1, 837.2, 866.8, 891.7, 911.6, 926.6, 937.4, 944.7, 949, 950.8, 950.3, 947.9, 943.9, 938.4, 931.8, 887.1, 833.7, 779.9, 729.5, 686.8, 650.4, 618.5, 590.2, 541.4, 500.4, 465.3, 434.8, 408, 384.6, 364.4, 346.5, 330.5, 316.1, 303.2, 291.3, 280.4, 270.4, 230.7, 202.2, 180.5, 163.5 };
    139123 
    140   for(i=0; i<60; i++) {e[1][i]=e1[i]*MeV*cm2/g;}
     124  AddData(T0, e1, 1);
    141125 
    142126  name [2] = "G4_ADIPOSE_TISSUE_ICRP";
    143127  G4double e2[60] = { 195.9, 239.9, 277, 309.7, 339.3, 387.5, 430.6, 469.4, 505, 537.2, 566.9, 594.6, 649.9, 696.7, 737.4, 773.3, 805.2, 833.4, 858.3, 880.5, 918.9, 951, 977.2, 997.6, 1013, 1023, 1030, 1034, 1034, 1033, 1029, 1023, 1016, 1008, 955.6, 895, 835.1, 779.6, 729.7, 685.6, 646.6, 612.3, 555, 509.1, 471.6, 440.3, 413.7, 390.4, 370.1, 352.1, 336, 321.4, 308.3, 296.3, 285.3, 275.2, 234.9, 206, 184, 166.7 };
    144128 
    145   for(i=0; i<60; i++) {e[2][i]=e2[i]*MeV*cm2/g;}
     129  AddData(T0, e2, 2);
    146130 
    147131  name [3] = "G4_Ag";
    148132  G4double e3[60] = { 29.73, 36.41, 42.05, 47.01, 51.5, 59.46, 66.48, 72.83, 78.66, 84.09, 89.2, 94.02, 103.7, 112.1, 119.7, 126.6, 132.8, 138.5, 143.7, 148.5, 157.1, 164.3, 170.5, 175.7, 180.1, 183.7, 186.7, 189.1, 191.1, 192.5, 193.6, 194.4, 194.8, 195, 193.4, 189.3, 184.4, 179.2, 174.1, 169.3, 164.8, 160.5, 152.7, 145.7, 139.5, 133.8, 128.6, 123.9, 119.5, 115.4, 111.7, 108.1, 104.8, 101.7, 98.74, 95.98, 84.49, 75.92, 69.3, 64.05 };
    149133 
    150   for(i=0; i<60; i++) {e[3][i]=e3[i]*MeV*cm2/g;}
     134  AddData(T0, e3, 3);
    151135 
    152136  name [4] = "G4_AIR";
    153137  G4double e4[60] = { 119.7, 146.7, 169.3, 189.3, 207.4, 239.5, 267.8, 293.3, 316.8, 338.7, 359.2, 378.7, 417, 450.4, 480.1, 506.7, 530.7, 552.6, 572.4, 590.5, 622.1, 648.3, 670, 687.7, 702, 713.2, 721.7, 727.8, 731.9, 734.1, 734.8, 734, 732, 729, 702.9, 667.2, 629.1, 592.2, 558.3, 527.8, 500.6, 476.3, 434.9, 401.2, 373.3, 349.8, 329.7, 312.1, 296.4, 282.4, 269.9, 258.7, 248.5, 239.1, 230.6, 222.7, 191.1, 168.2, 150.8, 137 };
    154138 
    155   for(i=0; i<60; i++) {e[4][i]=e4[i]*MeV*cm2/g;}
     139  AddData(T0, e4, 4);
    156140 
    157141  name [5] = "G4_Al";
    158142  G4double e5[60] = { 92.38, 113.1, 130.6, 146.1, 160, 184.8, 206.6, 226.3, 244.4, 261.3, 277.1, 292.1, 320.6, 344.8, 365.7, 383.8, 399.6, 413.2, 425, 435.1, 451, 462, 469.2, 473.4, 475.2, 475.1, 473.7, 471.2, 468, 464.2, 460.1, 455.8, 451.3, 446.8, 424.5, 404.5, 386.7, 371, 356.8, 344, 332.3, 321.5, 301.7, 284.2, 268.6, 254.8, 242.5, 231.4, 221.5, 212.4, 204.2, 196.6, 189.7, 183.3, 177.4, 171.9, 149.4, 132.7, 119.8, 109.4 };
    159143 
    160   for(i=0; i<60; i++) {e[5][i]=e5[i]*MeV*cm2/g;}
     144  AddData(T0, e5, 5);
    161145 
    162146  name [6] = "G4_ALUMINUM_OXIDE";
    163147  G4double e6[60] = { 73.51, 90.03, 104, 116.2, 127.3, 147, 164.4, 180.1, 194.5, 207.9, 220.5, 232.5, 256.1, 276.8, 295.3, 311.9, 327, 340.8, 353.4, 364.9, 385.3, 402.5, 417, 429.2, 439.3, 447.6, 454.3, 459.6, 463.7, 466.6, 468.6, 469.8, 470.2, 470, 461.9, 447.2, 430.1, 412.7, 396.5, 381.4, 367.5, 354.5, 331.1, 310.6, 292.6, 276.5, 262.2, 249.4, 238.1, 227.9, 218.7, 210.2, 202.6, 195.7, 189.2, 183.2, 158.9, 140.9, 127, 116 };
    164148 
    165   for(i=0; i<60; i++) {e[6][i]=e6[i]*MeV*cm2/g;}
     149  AddData(T0, e6, 6);
    166150 
    167151  name [7] = "G4_Ar";
    168152  G4double e7[60] = { 86.08, 105.4, 121.7, 136.1, 149.1, 172.2, 192.5, 210.9, 227.7, 243.5, 258.2, 272.2, 299.7, 323.5, 344.5, 363.3, 380.2, 395.3, 409, 421.4, 442.5, 459.4, 472.8, 483.1, 490.7, 496, 499.2, 500.7, 500.8, 499.5, 497.2, 494, 490, 485.5, 457.4, 426.7, 397.7, 371.9, 349.5, 330.1, 313.2, 298.5, 274.2, 254.9, 239, 225.6, 214.4, 204.7, 196.1, 188.4, 181.3, 174.9, 168.9, 163.4, 158.2, 153.3, 133, 118.2, 106.8, 97.72 };
    169153 
    170   for(i=0; i<60; i++) {e[7][i]=e7[i]*MeV*cm2/g;}
     154  AddData(T0, e7, 7);
    171155 
    172156  name [8] = "G4_Au";
    173157  G4double e8[60] = { 14.76, 18.07, 20.87, 23.33, 25.56, 29.51, 33, 36.15, 39.04, 41.74, 44.27, 46.66, 51.51, 55.8, 59.66, 63.18, 66.43, 69.43, 72.23, 74.84, 79.58, 83.77, 87.5, 90.81, 93.77, 96.4, 98.74, 100.8, 102.6, 104.3, 105.7, 106.9, 108, 108.9, 111.5, 112, 111.2, 109.6, 107.6, 105.4, 103.2, 101, 96.33, 91.8, 87.7, 84.05, 80.83, 78, 75.47, 73.18, 71.11, 69.21, 67.46, 65.83, 64.32, 62.91, 56.98, 52.39, 48.68, 45.58 };
    174158 
    175   for(i=0; i<60; i++) {e[8][i]=e8[i]*MeV*cm2/g;}
     159  AddData(T0, e8, 8);
    176160 
    177161  name [9] = "G4_B-100_BONE";
    178162  G4double e9[60] = { 142.5, 174.5, 201.5, 225.2, 246.7, 283.1, 315.3, 344.4, 371.1, 395.5, 418.2, 439.6, 482.3, 519, 551.3, 580.1, 606, 629.2, 650.1, 669, 701.9, 729.5, 752.2, 770.4, 784.5, 795.1, 802.6, 807.4, 810, 810.5, 809.3, 806.6, 802.7, 797.7, 762.5, 719.5, 676.2, 635.8, 599.3, 566.7, 537.9, 512.3, 468.1, 431.4, 400.8, 375, 353, 333.7, 316.9, 301.9, 288.5, 276.3, 265.3, 255.1, 245.9, 237.4, 203.4, 178.9, 160.2, 145.4 };
    179163 
    180   for(i=0; i<60; i++) {e[9][i]=e9[i]*MeV*cm2/g;}
     164  AddData(T0, e9, 9);
    181165 
    182166  name [10] = "G4_Be";
    183167  G4double e10[60] = { 149.7, 183.3, 211.7, 236.7, 259.2, 299.3, 334.7, 366.6, 396, 423.3, 449, 473.3, 517.2, 553.4, 583.6, 608.7, 629.6, 646.8, 660.7, 671.9, 687.3, 695.5, 698.4, 697.6, 694.2, 689.1, 682.8, 675.7, 668.2, 660.5, 652.7, 644.9, 637.2, 629.6, 594.2, 563, 535.4, 510.7, 488.4, 468.2, 449.8, 432.8, 404.4, 380.1, 358.1, 337.6, 318.8, 302.2, 287.4, 274.2, 262.3, 251.5, 241.7, 232.7, 224.4, 216.8, 186, 163.6, 146.3, 132.6 };
    184168 
    185   for(i=0; i<60; i++) {e[10][i]=e10[i]*MeV*cm2/g;}
     169  AddData(T0, e10, 10);
    186170 
    187171  name [11] = "G4_BONE_COMPACT_ICRU";
    188172  G4double e11[60] = { 141.6, 173.4, 200.2, 223.8, 245.2, 281.3, 313.3, 342.2, 368.8, 393.1, 415.6, 436.8, 479, 515.2, 547, 575.3, 600.7, 623.4, 643.8, 662.1, 694.2, 721, 743.2, 760.9, 774.8, 785.2, 792.6, 797.6, 800.3, 801.1, 800.3, 797.9, 794.4, 789.9, 756.4, 714.5, 671.4, 630.5, 593.2, 559.7, 530, 503.5, 459, 423, 393.3, 368.3, 346.9, 328.1, 311.6, 296.9, 283.7, 271.8, 261, 251.1, 242, 233.7, 200.3, 176.3, 158, 143.5 };
    189173 
    190   for(i=0; i<60; i++) {e[11][i]=e11[i]*MeV*cm2/g;}
     174  AddData(T0, e11, 11);
    191175 
    192176  name [12] = "G4_C";
    193177  G4double e12[60] = { 138.4, 169.5, 195.7, 218.8, 239.7, 270.2, 297.8, 322.7, 345.4, 365.1, 382.6, 398.7, 433.5, 462.4, 487.4, 509.9, 530, 547.7, 563.4, 577.6, 603.9, 628.3, 650.1, 668.6, 683.5, 695.3, 704.5, 711.4, 716.3, 719.4, 720.8, 720.9, 719.7, 717.4, 694.5, 661.1, 624.7, 589.1, 556, 526, 499.1, 475, 435.8, 404.4, 377.9, 354.6, 334, 315.9, 300.2, 286.2, 273.7, 262.4, 252.2, 242.7, 234.1, 226.1, 194.2, 171.1, 153.4, 139.4 };
    194178 
    195   for(i=0; i<60; i++) {e[12][i]=e12[i]*MeV*cm2/g;}
    196  
    197   name [13] = "G4_GRAPHITE";
     179  AddData(T0, e12, 12);
     180 
     181  name [13] = "G4_GRAPHITE_POROUS";
    198182  G4double e13[60] = { 142.6, 175.3, 203.1, 228, 250.5, 283.4, 313.3, 340.4, 365.1, 386.7, 405.9, 423.5, 462, 494, 521.9, 546.9, 569.3, 589.2, 606.9, 622.9, 652.4, 679.9, 704.5, 725.3, 742.2, 755.6, 766.1, 774, 779.6, 783.1, 784.7, 784.8, 783.4, 780.7, 753.8, 714.5, 671.4, 629.1, 590.2, 555.6, 524.9, 497.7, 453.9, 419.3, 390.3, 365.1, 343, 323.7, 307.1, 292.3, 279.1, 267.3, 256.6, 246.8, 237.8, 229.5, 196.7, 173, 155, 140.8 };
    199183 
    200   for(i=0; i<60; i++) {e[13][i]=e13[i]*MeV*cm2/g;}
     184  AddData(T0, e13, 13);
    201185 
    202186  name [14] = "G4_ETHYLENE";
    203187  G4double e14[60] = { 225.8, 276.5, 319.3, 357, 391.1, 445.9, 494.9, 539.1, 579.6, 616, 649.5, 680.6, 742.9, 795.1, 840.1, 879.9, 914.8, 945.5, 972.4, 996.1, 1037, 1071, 1099, 1120, 1135, 1145, 1150, 1152, 1152, 1148, 1142, 1135, 1126, 1115, 1052, 981.5, 912.8, 849.7, 795.6, 749, 708.3, 672.4, 611.7, 562.1, 520.6, 485.3, 454.9, 428.4, 405.5, 385.2, 367.1, 350.8, 336.2, 322.8, 310.5, 299.3, 254.6, 222.7, 198.6, 179.6 };
    204188 
    205   for(i=0; i<60; i++) {e[14][i]=e14[i]*MeV*cm2/g;}
     189  AddData(T0, e14, 14);
    206190 
    207191  name [15] = "G4_C-552";
    208192  G4double e15[60] = { 119.2, 146, 168.6, 188.5, 206.5, 235.1, 260.7, 283.8, 305, 323.9, 341.3, 357.4, 390.7, 418.9, 443.7, 465.8, 485.7, 503.6, 519.5, 534.1, 560.1, 583.2, 603.2, 620, 633.7, 644.7, 653.4, 660.1, 665, 668.4, 670.3, 671.1, 670.7, 669.5, 652.9, 626.4, 596.2, 565.7, 537, 510.7, 486.8, 465.1, 427.5, 396.1, 369.6, 347, 327.4, 310.1, 294.9, 281.3, 269, 258, 247.9, 238.6, 230.2, 222.4, 191, 168.2, 150.8, 137 };
    209193 
    210   for(i=0; i<60; i++) {e[15][i]=e15[i]*MeV*cm2/g;}
     194  AddData(T0, e15, 15);
    211195 
    212196  name [16] = "G4_CARBON_DIOXIDE";
    213197  G4double e16[60] = { 106.4, 130.3, 150.4, 168.2, 184.2, 212.7, 237.9, 260.6, 281.4, 300.9, 319.1, 336.4, 370.9, 401.2, 428.3, 452.8, 475.1, 495.6, 514.4, 531.8, 562.6, 588.8, 611.2, 630.2, 646.1, 659.3, 670.1, 678.6, 685.2, 690, 693.2, 694.9, 695.4, 694.8, 679, 650.5, 617.3, 583.6, 552.1, 523.6, 497.8, 474.6, 434.7, 401.8, 374.3, 351, 330.9, 313.2, 297.6, 283.7, 271.2, 259.9, 249.6, 240.3, 231.7, 223.7, 191.9, 168.9, 151.4, 137.5 };
    214198 
    215   for(i=0; i<60; i++) {e[16][i]=e16[i]*MeV*cm2/g;}
     199  AddData(T0, e16, 16);
    216200 
    217201  name [17] = "G4_CALCIUM_FLUORIDE";
    218202  G4double e17[60] = { 74.48, 91.21, 105.3, 117.8, 129, 149, 166.5, 182.4, 197, 210.6, 223.4, 235.5, 259.6, 280.7, 299.6, 316.6, 332, 346.2, 359.1, 371.1, 392.2, 410.1, 425.2, 438, 448.7, 457.5, 464.6, 470.3, 474.7, 477.9, 480.1, 481.4, 481.9, 481.7, 473, 456.7, 437.6, 417.8, 398.6, 380.6, 364, 348.7, 322.9, 301.7, 283.5, 267.5, 253.4, 240.9, 229.8, 219.9, 210.8, 202.5, 194.8, 187.7, 181.3, 175.5, 151.6, 134.4, 121.1, 110.6 };
    219203 
    220   for(i=0; i<60; i++) {e[17][i]=e17[i]*MeV*cm2/g;}
     204  AddData(T0, e17, 17);
    221205 
    222206  name [18] = "G4_CERIC_SULFATE";
    223207  G4double e18[60] = { 135.4, 165.8, 191.5, 214.1, 234.5, 270.8, 302.8, 331.7, 358.2, 383, 406.2, 428.2, 471.7, 509.8, 543.6, 574, 601.5, 626.5, 649.3, 670.1, 706.4, 736.5, 761.2, 781.4, 797.4, 809.8, 819, 825.3, 829.2, 830.8, 830.6, 828.7, 825.4, 820.9, 785.9, 741.4, 696, 653.6, 618.4, 588.8, 562.8, 539.6, 499.3, 464.8, 434.6, 407.9, 384.2, 363.4, 344.9, 328.4, 313.6, 300.3, 288.2, 277.2, 267, 257.7, 220.4, 193.5, 173, 156.9 };
    224208 
    225   for(i=0; i<60; i++) {e[18][i]=e18[i]*MeV*cm2/g;}
     209  AddData(T0, e18, 18);
    226210 
    227211  name [19] = "G4_CELLULOSE_NITRATE";
    228212  G4double e19[60] = { 132.2, 161.9, 187, 209, 229, 262.6, 292.5, 319.4, 344.2, 366.8, 387.8, 407.5, 447, 481, 510.8, 537.6, 561.6, 583.2, 602.7, 620.4, 651.5, 677.9, 700, 718.2, 732.7, 744.1, 752.7, 759, 763.2, 765.5, 766.2, 765.5, 763.5, 760.6, 734.4, 698.2, 659.3, 621.4, 586, 553.8, 524.9, 498.9, 452.4, 413.9, 382.9, 358, 337.7, 319.7, 303.9, 289.7, 277.1, 265.6, 255.2, 245.6, 236.9, 228.8, 196.4, 173, 155, 140.8 };
    229213 
    230   for(i=0; i<60; i++) {e[19][i]=e19[i]*MeV*cm2/g;}
     214  AddData(T0, e19, 19);
    231215 
    232216  name [20] = "G4_BONE_CORTICAL_ICRP";
    233217  G4double e20[60] = { 123.5, 151.3, 174.7, 195.3, 214, 246.1, 274.5, 300.2, 323.8, 345.6, 365.9, 385, 423, 455.7, 484.7, 510.5, 533.8, 554.8, 573.7, 590.9, 620.8, 645.9, 666.5, 683.3, 696.6, 706.8, 714.4, 719.7, 723, 724.5, 724.5, 723.1, 720.6, 717.1, 689.6, 653.5, 615.8, 579.8, 546.6, 516.7, 490, 466.2, 426.1, 393.6, 366.6, 343.7, 324, 306.7, 291.5, 278, 265.8, 254.7, 244.7, 235.5, 227.1, 219.4, 188.4, 166.1, 149, 135.4 };
    234218 
    235   for(i=0; i<60; i++) {e[20][i]=e20[i]*MeV*cm2/g;}
     219  AddData(T0, e20, 20);
    236220 
    237221  name [21] = "G4_CESIUM_IODIDE";
    238222  G4double e21[60] = { 34.67, 42.46, 49.03, 54.82, 60.05, 69.34, 77.52, 84.92, 91.73, 98.06, 104, 109.6, 121, 130.9, 139.9, 148, 155.5, 162.3, 168.6, 174.5, 184.9, 194, 201.8, 208.5, 214.2, 219, 223, 226.3, 228.9, 231, 232.5, 233.4, 234, 234.1, 230.4, 221.9, 211.4, 200.6, 190.1, 180.6, 171.9, 164.1, 151.1, 140.6, 132.1, 125.1, 119.1, 114, 109.6, 105.6, 102.1, 98.92, 95.83, 92.83, 89.95, 87.22, 75.76, 67.41, 61.26, 56.63 };
    239223 
    240   for(i=0; i<60; i++) {e[21][i]=e21[i]*MeV*cm2/g;}
     224  AddData(T0, e21, 21);
    241225 
    242226  name [22] = "G4_Cu";
    243227  G4double e22[60] = { 34.9, 42.74, 49.35, 55.18, 60.45, 69.8, 78.04, 85.48, 92.33, 98.71, 104.7, 110.4, 121.4, 130.9, 139.2, 146.6, 153.2, 159, 164.3, 168.9, 176.9, 183.2, 188.4, 192.5, 195.9, 198.7, 201, 202.8, 204.4, 205.6, 206.7, 207.5, 208.2, 208.7, 209.9, 209.2, 207.5, 205.1, 202.3, 199.1, 195.8, 192.3, 185.4, 178.6, 172, 165.8, 159.6, 153.6, 148, 142.7, 137.8, 133.3, 129.1, 125.2, 121.7, 118.3, 104.7, 94.43, 86.45, 79.87 };
    244228 
    245   for(i=0; i<60; i++) {e[22][i]=e22[i]*MeV*cm2/g;}
     229  AddData(T0, e22, 22);
    246230 
    247231  name [23] = "G4_Fe";
    248232  G4double e23[60] = { 37.81, 46.31, 53.47, 59.78, 65.49, 75.62, 84.54, 92.61, 100, 106.9, 113.4, 119.6, 132, 143, 153, 162, 170.4, 178.2, 185.4, 192.2, 204.6, 215.6, 225.4, 234.2, 242.1, 249.2, 255.5, 261.2, 266.2, 270.7, 274.6, 278.1, 281, 283.6, 290.9, 291.5, 287.6, 281, 272.8, 263.9, 254.9, 246, 229.5, 214.8, 202.1, 191.1, 181.6, 173.4, 166.2, 159.7, 153.8, 148.5, 143.6, 139.1, 135, 131.1, 115.3, 103.5, 94.02, 86.52 };
    249233 
    250   for(i=0; i<60; i++) {e[23][i]=e23[i]*MeV*cm2/g;}
     234  AddData(T0, e23, 23);
    251235 
    252236  name [24] = "G4_FERROUS_SULFATE";
    253237  G4double e24[60] = { 135.1, 165.5, 191.1, 213.6, 234, 270.2, 302.1, 330.9, 357.4, 382.1, 405.3, 427.2, 470.7, 508.7, 542.4, 572.8, 600.3, 625.3, 648, 668.8, 705, 735.1, 759.9, 780.1, 796.1, 808.5, 817.7, 824.1, 827.9, 829.6, 829.4, 827.5, 824.2, 819.7, 784.9, 740.5, 695.1, 652.8, 617.8, 588.4, 562.8, 539.9, 499.9, 465.6, 435.5, 408.8, 385, 364.1, 345.6, 329.1, 314.3, 300.9, 288.8, 277.7, 267.6, 258.3, 220.8, 193.9, 173.4, 157.2 };
    254238 
    255   for(i=0; i<60; i++) {e[24][i]=e24[i]*MeV*cm2/g;}
     239  AddData(T0, e24, 24);
    256240 
    257241  name [25] = "G4_Gd";
    258242  G4double e25[60] = { 25.71, 31.49, 36.37, 40.66, 44.54, 51.43, 57.5, 62.99, 68.03, 72.73, 77.14, 81.32, 89.78, 97.24, 104, 110.1, 115.8, 121, 125.8, 130.4, 138.5, 145.7, 152.1, 157.7, 162.6, 166.9, 170.7, 173.9, 176.7, 179, 181, 182.5, 183.8, 184.7, 185.6, 182.1, 176.3, 169.4, 162.2, 155.2, 148.7, 142.6, 132, 123.3, 116.2, 110.2, 105, 100.6, 96.67, 93.2, 90.08, 87.27, 84.72, 82.38, 80.24, 78.26, 70.14, 63.87, 58.87, 54.76 };
    259243 
    260   for(i=0; i<60; i++) {e[25][i]=e25[i]*MeV*cm2/g;}
     244  AddData(T0, e25, 25);
    261245 
    262246  name [26] = "G4_Ge";
    263247  G4double e26[60] = { 45.91, 56.23, 64.93, 72.59, 79.52, 91.82, 102.7, 112.5, 121.5, 129.9, 137.7, 145.2, 159.7, 172.3, 183.3, 193.1, 201.7, 209.4, 216.3, 222.3, 232.3, 240, 245.6, 249.6, 252.3, 253.9, 254.5, 254.5, 253.9, 252.9, 251.5, 250, 248.2, 246.4, 236.5, 227.2, 218.9, 211.6, 205.1, 199.3, 193.9, 189, 180.1, 172.3, 165.2, 158.8, 152.6, 146.6, 140.9, 135.7, 130.8, 126.3, 122.1, 118.3, 114.7, 111.3, 97.72, 87.77, 80.18, 74.18 };
    264248 
    265   for(i=0; i<60; i++) {e[26][i]=e26[i]*MeV*cm2/g;}
     249  AddData(T0, e26, 26);
    266250 
    267251  name [27] = "G4_Pyrex_Glass";
    268252  G4double e27[60] = { 88.74, 108.7, 125.5, 140.3, 153.7, 177.5, 198.4, 217.4, 234.8, 251, 266.2, 280.6, 308.9, 333.6, 355.6, 375.3, 393.1, 409.2, 423.9, 437.3, 460.8, 480.4, 496.7, 510.2, 521.2, 530.1, 537.1, 542.5, 546.4, 549.1, 550.6, 551.2, 551, 550.1, 537.6, 518.1, 496.1, 473.9, 451.2, 429.2, 408.8, 390.1, 357.9, 331.5, 309.8, 291.7, 276.2, 262.4, 250.1, 239.1, 229.2, 220.2, 212, 204.6, 197.7, 191.4, 165.6, 146.7, 132.1, 120.4 };
    269253 
    270   for(i=0; i<60; i++) {e[27][i]=e27[i]*MeV*cm2/g;}
     254  AddData(T0, e27, 27);
    271255 
    272256  name [28] = "G4_H";
    273257  G4double e28[60] = { 746.5, 914.3, 1056, 1180, 1293, 1493, 1669, 1829, 1975, 2112, 2240, 2361, 2586, 2777, 2942, 3084, 3208, 3316, 3409, 3490, 3618, 3710, 3771, 3808, 3823, 3822, 3807, 3781, 3745, 3702, 3654, 3601, 3545, 3487, 3183, 2890, 2629, 2402, 2204, 2031, 1882, 1753, 1544, 1384, 1258, 1159, 1077, 1007, 947, 894.2, 847.5, 805.9, 768.6, 734.9, 704.3, 676.4, 566.7, 489.7, 432.5, 388.1 };
    274258 
    275   for(i=0; i<60; i++) {e[28][i]=e28[i]*MeV*cm2/g;}
     259  AddData(T0, e28, 28);
    276260 
    277261  name [29] = "G4_He";
    278262  G4double e29[60] = { 184.2, 225.6, 260.6, 291.3, 319.1, 368.5, 412, 451.3, 487.4, 521.1, 552.7, 582.6, 641.3, 691.9, 736.7, 776.6, 812.5, 844.9, 874.2, 900.8, 946.6, 984.1, 1014, 1039, 1058, 1072, 1083, 1089, 1093, 1094, 1093, 1090, 1085, 1079, 1032, 973, 911.2, 852.1, 797.5, 748.3, 704.5, 665.8, 600.4, 547.7, 504.5, 468.3, 437.7, 411.3, 388.2, 368, 349.9, 333.8, 319.3, 306.2, 294.2, 283.2, 239.6, 208.6, 185.2, 167 };
    279263 
    280   for(i=0; i<60; i++) {e[29][i]=e29[i]*MeV*cm2/g;}
     264  AddData(T0, e29, 29);
    281265 
    282266  name [30] = "G4_KAPTON";
    283267  G4double e30[60] = { 145.4, 178.1, 205.6, 229.9, 251.8, 286.2, 317.1, 344.9, 370.4, 393.1, 413.7, 432.9, 472.6, 506.1, 535.2, 561.3, 584.6, 605.3, 623.8, 640.4, 670.2, 696.5, 719.1, 737.7, 752.5, 763.9, 772.5, 778.6, 782.6, 784.6, 784.9, 783.8, 781.4, 778, 749.2, 710.6, 669.6, 630, 593.5, 560.4, 530.8, 504.4, 459.6, 423.3, 393.3, 368.2, 346.8, 328, 311.6, 296.9, 283.8, 272, 261.3, 251.5, 242.4, 234.1, 200.8, 176.8, 158.4, 143.8 };
    284268 
    285   for(i=0; i<60; i++) {e[30][i]=e30[i]*MeV*cm2/g;}
     269  AddData(T0, e30, 30);
    286270 
    287271  name [31] = "G4_Kr";
    288272  G4double e31[60] = { 45.92, 56.24, 64.94, 72.6, 79.53, 91.84, 102.7, 112.5, 121.5, 129.9, 137.8, 145.2, 160.1, 173.2, 184.9, 195.5, 205.1, 213.8, 221.8, 229.1, 242, 252.7, 261.6, 268.8, 274.6, 279, 282.3, 284.5, 285.8, 286.2, 286, 285.1, 283.8, 281.9, 268.6, 252.2, 236.2, 221.7, 209, 198.2, 188.9, 180.9, 168.1, 158.1, 150.2, 143.7, 138.1, 133.2, 128.8, 124.8, 121.2, 117.8, 114.6, 111.6, 108.8, 106.1, 94.63, 85.43, 77.91, 71.84 };
    289273 
    290   for(i=0; i<60; i++) {e[31][i]=e31[i]*MeV*cm2/g;}
     274  AddData(T0, e31, 31);
    291275 
    292276  name [32] = "G4_LITHIUM_TETRABORATE";
    293277  G4double e32[60] = { 111, 135.9, 157, 175.5, 192.2, 222, 248.2, 271.9, 293.6, 313.9, 333, 351, 386.5, 417.4, 444.8, 469.4, 491.6, 511.7, 530.1, 546.7, 575.8, 599.9, 619.8, 636, 649.1, 659.3, 667.2, 672.9, 676.7, 678.9, 679.6, 679.1, 677.6, 675.1, 653, 622.4, 589.5, 557.3, 525.5, 495.6, 468.4, 444.1, 403.1, 370.6, 344.6, 323.5, 305.9, 290.3, 276.4, 263.9, 252.7, 242.4, 233.2, 224.7, 216.9, 209.6, 180.4, 159.2, 142.8, 129.9 };
    294278 
    295   for(i=0; i<60; i++) {e[32][i]=e32[i]*MeV*cm2/g;}
     279  AddData(T0, e32, 32);
    296280 
    297281  name [33] = "G4_LITHIUM_FLUORIDE";
    298282  G4double e33[60] = { 80.87, 99.04, 114.4, 127.9, 140.1, 161.7, 180.8, 198.1, 214, 228.7, 242.6, 255.7, 281.9, 304.9, 325.4, 344, 360.9, 376.5, 390.8, 404, 427.6, 447.8, 465.3, 480.3, 493.1, 504.1, 513.3, 521.1, 527.4, 532.5, 536.5, 539.6, 541.7, 543, 540.3, 527.4, 509.2, 488.8, 467.4, 446.5, 426.9, 408.7, 376.9, 350.4, 328, 309.1, 292.7, 278.1, 265.1, 253.3, 242.5, 232.8, 223.9, 215.6, 208.2, 201.2, 173.1, 152.5, 136.8, 124.4 };
    299283 
    300   for(i=0; i<60; i++) {e[33][i]=e33[i]*MeV*cm2/g;}
     284  AddData(T0, e33, 33);
    301285 
    302286  name [34] = "G4_M3_WAX";
    303287  G4double e34[60] = { 198.1, 242.6, 280.2, 313.3, 343.1, 391.9, 435.4, 474.6, 510.6, 543.1, 573, 601, 656.7, 703.7, 744.4, 780.4, 812.2, 840.3, 865, 887, 925, 956.5, 982.1, 1002, 1016, 1026, 1032, 1035, 1036, 1033, 1029, 1023, 1016, 1007, 953.3, 891.9, 831.3, 775.4, 725.1, 680.6, 641.3, 606.6, 546.6, 497.8, 458.8, 427.4, 401.7, 379.2, 359.6, 342.2, 326.7, 312.7, 300.1, 288.5, 277.8, 268.1, 229.1, 201, 179.7, 162.8 };
    304288 
    305   for(i=0; i<60; i++) {e[34][i]=e34[i]*MeV*cm2/g;}
     289  AddData(T0, e34, 34);
    306290 
    307291  name [35] = "G4_MS20_TISSUE";
    308292  G4double e35[60] = { 174.4, 213.6, 246.7, 275.8, 302.1, 345, 383.2, 417.7, 449.4, 477.9, 504.3, 528.8, 578.1, 619.8, 656, 688.2, 716.7, 742, 764.4, 784.4, 819.3, 848.7, 872.8, 892, 906.4, 916.8, 923.7, 927.8, 929.4, 928.8, 926.4, 922.3, 916.9, 910.4, 866.6, 814.5, 762, 712.8, 668.3, 628.6, 593.3, 562.1, 507.7, 463.3, 427.6, 398.9, 375.3, 354.7, 336.7, 320.6, 306.2, 293.3, 281.6, 270.9, 261, 252, 215.7, 189.5, 169.6, 153.9 };
    309293 
    310   for(i=0; i<60; i++) {e[35][i]=e35[i]*MeV*cm2/g;}
     294  AddData(T0, e35, 35);
    311295 
    312296  name [36] = "G4_METHANE";
    313297  G4double e36[60] = { 272.8, 334.1, 385.8, 431.4, 472.5, 545.6, 610, 668.2, 721.8, 771.6, 818.4, 862.7, 949.2, 1024, 1090, 1148, 1200, 1246, 1288, 1325, 1387, 1436, 1473, 1500, 1518, 1528, 1532, 1530, 1524, 1514, 1501, 1485, 1467, 1447, 1338, 1227, 1127, 1041, 967.3, 904.6, 850.4, 803.2, 724.6, 661.8, 610.5, 567.7, 531.4, 499.8, 472.5, 448.3, 426.7, 407.4, 390, 374.1, 359.6, 346.4, 293.7, 256.2, 227.9, 205.7 };
    314298 
    315   for(i=0; i<60; i++) {e[36][i]=e36[i]*MeV*cm2/g;}
     299  AddData(T0, e36, 36);
    316300 
    317301  name [37] = "G4_Mo";
    318302  G4double e37[60] = { 40.18, 49.21, 56.82, 63.53, 69.59, 80.35, 89.84, 98.41, 106.3, 113.6, 120.5, 127, 140.2, 151.7, 162.1, 171.5, 180.1, 188, 195.4, 202.1, 214.3, 224.8, 233.8, 241.6, 248.3, 253.9, 258.7, 262.6, 265.7, 268.2, 270, 271.3, 272.1, 272.4, 268.7, 259.5, 248, 235.8, 224, 213.1, 203.1, 194.1, 178.9, 166.6, 156.5, 148.1, 141, 134.9, 129.5, 124.7, 120.4, 116.4, 112.6, 109.1, 105.8, 102.6, 89.8, 80.34, 73.15, 67.51 };
    319303 
    320   for(i=0; i<60; i++) {e[37][i]=e37[i]*MeV*cm2/g;}
     304  AddData(T0, e37, 37);
    321305 
    322306  name [38] = "G4_MUSCLE_WITH_SUCROSE";
    323307  G4double e38[60] = { 149.4, 183, 211.3, 236.2, 258.7, 298.3, 333.3, 364.8, 393.8, 420.8, 446, 469.8, 516.6, 557.2, 593.1, 625.2, 654, 680, 703.5, 724.8, 761.7, 792, 816.7, 836.5, 851.9, 863.6, 871.9, 877.4, 880.4, 881.2, 880.1, 877.3, 873.2, 867.9, 829.5, 781.9, 733.4, 688, 647.9, 612.8, 581.8, 554.2, 507.1, 468.4, 435.9, 408.3, 384.4, 363.5, 344.9, 328.4, 313.7, 300.3, 288.2, 277.2, 267, 257.7, 220.4, 193.5, 173, 156.9 };
    324308 
    325   for(i=0; i<60; i++) {e[38][i]=e38[i]*MeV*cm2/g;}
     309  AddData(T0, e38, 38);
    326310 
    327311  name [39] = "G4_MUSCLE_WITHOUT_SUCROSE";
    328312  G4double e39[60] = { 146.6, 179.5, 207.3, 231.8, 253.9, 292.9, 327.3, 358.4, 386.9, 413.5, 438.4, 461.9, 508.2, 548.4, 584, 615.8, 644.5, 670.4, 693.8, 715.1, 752, 782.3, 807.1, 827, 842.5, 854.3, 862.9, 868.5, 871.6, 872.6, 871.6, 869, 865, 859.8, 822, 774.9, 726.9, 682, 643, 609.2, 579.4, 552.9, 507.4, 469.6, 437.7, 410.1, 386.1, 365.1, 346.5, 329.9, 315, 301.6, 289.4, 278.3, 268.2, 258.8, 221.3, 194.3, 173.7, 157.5 };
    329313 
    330   for(i=0; i<60; i++) {e[39][i]=e39[i]*MeV*cm2/g;}
     314  AddData(T0, e39, 39);
    331315 
    332316  name [40] = "G4_MUSCLE_SKELETAL_ICRP";
    333317  G4double e40[60] = { 141.3, 173.1, 199.9, 223.5, 244.8, 282.5, 315.8, 345.8, 373.5, 399.2, 423.3, 446.1, 491.1, 530.2, 565, 596.1, 624.2, 649.7, 672.8, 693.8, 730.4, 760.6, 785.3, 805.3, 821.1, 833.1, 841.9, 847.9, 851.4, 852.6, 852, 849.7, 846.1, 841.2, 804.8, 758.9, 712.2, 668.5, 631.2, 599, 570.8, 545.6, 502.2, 465.8, 434.6, 407.5, 383.7, 362.8, 344.4, 327.9, 313.1, 299.8, 287.7, 276.7, 266.6, 257.3, 220, 193.2, 172.8, 156.7 };
    334318 
    335   for(i=0; i<60; i++) {e[40][i]=e40[i]*MeV*cm2/g;}
     319  AddData(T0, e40, 40);
    336320 
    337321  name [41] = "G4_MUSCLE_STRIATED_ICRU";
    338322  G4double e41[60] = { 141.7, 173.5, 200.4, 224, 245.4, 283.2, 316.5, 346.6, 374.3, 400, 424.2, 447, 492.1, 531.3, 566.1, 597.3, 625.4, 650.9, 674, 695.1, 731.6, 761.9, 786.7, 806.6, 822.4, 834.4, 843.3, 849.2, 852.6, 853.9, 853.2, 851, 847.3, 842.4, 805.8, 759.8, 713, 669.2, 632, 600.1, 572.1, 547.1, 504, 467.7, 436.5, 409.3, 385.3, 364.3, 345.7, 329.2, 314.4, 300.9, 288.8, 277.8, 267.6, 258.3, 220.8, 193.9, 173.4, 157.2 };
    339323 
    340   for(i=0; i<60; i++) {e[41][i]=e41[i]*MeV*cm2/g;}
     324  AddData(T0, e41, 41);
    341325 
    342326  name [42] = "G4_N";
    343327  G4double e42[60] = { 126.5, 155, 179, 200.1, 219.2, 253.1, 283, 310, 334.8, 357.9, 379.6, 400.2, 440.6, 475.8, 507, 535, 560.2, 583.1, 603.8, 622.7, 655.5, 682.7, 704.9, 722.9, 737.3, 748.4, 756.6, 762.3, 765.9, 767.5, 767.5, 766, 763.3, 759.4, 729.3, 689.8, 648.6, 609.1, 572.9, 540.4, 511.6, 486.2, 443.4, 408.8, 380.1, 356, 335.4, 317.2, 301.2, 286.8, 274.1, 262.6, 252.2, 242.7, 234, 225.9, 193.8, 170.5, 152.8, 138.8 };
    344328 
    345   for(i=0; i<60; i++) {e[42][i]=e42[i]*MeV*cm2/g;}
     329  AddData(T0, e42, 42);
    346330 
    347331  name [43] = "G4_SODIUM_IODIDE";
    348332  G4double e43[60] = { 41.1, 50.34, 58.12, 64.98, 71.19, 82.2, 91.9, 100.7, 108.7, 116.2, 123.3, 130, 143.4, 155.2, 165.8, 175.4, 184.2, 192.3, 199.7, 206.6, 219, 229.6, 238.9, 246.8, 253.5, 259.2, 264, 268, 271.1, 273.6, 275.4, 276.7, 277.4, 277.7, 273.7, 264.2, 252.3, 239.7, 227.6, 216.2, 205.9, 196.6, 180.7, 167.8, 157.3, 148.5, 141.1, 134.7, 129.1, 124.1, 119.7, 115.7, 111.9, 108.4, 105.1, 101.9, 88.79, 78.99, 71.48, 65.54 };
    349333 
    350   for(i=0; i<60; i++) {e[43][i]=e43[i]*MeV*cm2/g;}
     334  AddData(T0, e43, 43);
    351335 
    352336  name [44] = "G4_Ne";
    353337  G4double e44[60] = { 58.01, 71.05, 82.04, 91.73, 100.5, 116, 129.7, 142.1, 153.5, 164.1, 174, 183.5, 202.5, 219.3, 234.5, 248.3, 261, 272.8, 283.8, 294, 312.7, 329.2, 343.8, 356.9, 368.6, 379, 388.3, 396.5, 403.8, 410.2, 415.8, 420.7, 424.8, 428.4, 438.1, 437.9, 431.3, 420.8, 408.2, 394.6, 380.7, 367.1, 339, 313.8, 293.3, 277.2, 264.3, 252.6, 241.9, 232.2, 223.2, 215, 207.4, 200.4, 193.8, 187.7, 163, 144.6, 130.3, 118.9 };
    354338 
    355   for(i=0; i<60; i++) {e[44][i]=e44[i]*MeV*cm2/g;}
    356  
    357   name [45] = "G4_NYLON_6/6";
     339  AddData(T0, e44, 44);
     340 
     341  name [45] = "G4_NYLON-6-6";
    358342  G4double e45[60] = { 191, 233.9, 270.1, 302, 330.8, 377.8, 419.7, 457.5, 492.1, 523.4, 552.3, 579.2, 633, 678.5, 717.9, 752.9, 783.8, 811.1, 835.3, 856.8, 894.2, 925.4, 951, 971, 985.8, 996.3, 1003, 1007, 1008, 1006, 1003, 997.7, 991.2, 983.5, 933.5, 875.4, 817.5, 763.6, 715, 671.7, 633.5, 599.6, 542.9, 497.4, 460.4, 429.7, 403.7, 381, 361.2, 343.6, 327.9, 313.8, 301, 289.3, 278.6, 268.8, 229.5, 201.3, 179.8, 162.9 };
    359343 
    360   for(i=0; i<60; i++) {e[45][i]=e45[i]*MeV*cm2/g;}
     344  AddData(T0, e45, 45);
    361345 
    362346  name [46] = "G4_O";
    363347  G4double e46[60] = { 99.46, 121.8, 140.7, 157.3, 172.3, 198.9, 222.4, 243.6, 263.1, 281.3, 298.4, 314.5, 346.6, 374.7, 399.8, 422.4, 443, 461.9, 479.1, 495, 523.1, 547, 567.2, 584.4, 598.7, 610.6, 620.2, 628, 633.9, 638.3, 641.3, 643, 643.6, 643.3, 630.5, 606.7, 578.3, 549.1, 520.9, 494.6, 470.9, 449.7, 413.2, 383.1, 357.8, 336.3, 317.6, 301.1, 286.3, 273.2, 261.3, 250.5, 240.8, 231.9, 223.7, 216.1, 185.7, 163.7, 146.7, 133.4 };
    364348 
    365   for(i=0; i<60; i++) {e[46][i]=e46[i]*MeV*cm2/g;}
     349  AddData(T0, e46, 46);
    366350 
    367351  name [47] = "G4_PARAFFIN";
    368352  G4double e47[60] = { 228.8, 280.2, 323.5, 361.7, 396.2, 451.9, 501.6, 546.5, 587.6, 624.6, 658.6, 690.2, 753.4, 806.4, 852.1, 892.4, 927.9, 959.1, 986.3, 1010, 1052, 1086, 1114, 1135, 1150, 1160, 1166, 1168, 1166, 1163, 1157, 1149, 1140, 1129, 1064, 992.4, 922.6, 858.6, 801.5, 751.1, 706.8, 667.8, 601.8, 548.9, 506.2, 471.3, 442.2, 416.9, 394.9, 375.4, 358, 342.3, 328.2, 315.3, 303.4, 292.6, 249.3, 218.3, 194.8, 176.3 };
    369353 
    370   for(i=0; i<60; i++) {e[47][i]=e47[i]*MeV*cm2/g;}
     354  AddData(T0, e47, 47);
    371355 
    372356  name [48] = "G4_Pb";
    373357  G4double e48[60] = { 15.4, 18.86, 21.78, 24.35, 26.68, 30.81, 34.44, 37.73, 40.75, 43.57, 46.21, 48.71, 53.82, 58.34, 62.45, 66.21, 69.7, 72.94, 75.98, 78.85, 84.11, 88.84, 93.13, 97.02, 100.6, 103.8, 106.8, 109.5, 111.9, 114.1, 116.2, 118, 119.6, 121.1, 126.1, 128.1, 127.9, 126.3, 123.6, 120.4, 116.9, 113.3, 106.4, 99.98, 94.37, 89.5, 85.18, 81.37, 78.01, 75.05, 72.42, 70.08, 67.99, 66.12, 64.44, 62.92, 56.88, 52.22, 48.46, 45.34 };
    374358 
    375   for(i=0; i<60; i++) {e[48][i]=e48[i]*MeV*cm2/g;}
     359  AddData(T0, e48, 48);
    376360 
    377361  name [49] = "G4_PHOTO_EMULSION";
    378362  G4double e49[60] = { 61.33, 75.12, 86.74, 96.97, 106.2, 122.2, 136.3, 149.1, 160.8, 171.6, 181.6, 191.1, 210, 226.3, 240.6, 253.5, 265, 275.4, 284.8, 293.3, 308, 320.3, 330.3, 338.4, 344.7, 349.4, 352.8, 355.1, 356.4, 356.9, 356.6, 355.7, 354.3, 352.4, 338.9, 322.3, 305.5, 289.9, 275.7, 263, 251.7, 241.5, 224.4, 210.3, 198.3, 188, 179, 171, 163.9, 157.5, 151.6, 146.3, 141.3, 136.6, 132.1, 128, 110.6, 97.75, 87.92, 80.2 };
    379363 
    380   for(i=0; i<60; i++) {e[49][i]=e49[i]*MeV*cm2/g;}
     364  AddData(T0, e49, 49);
    381365 
    382366  name [50] = "G4_PLASTIC_SC_VINYLTOLUENE";
    383367  G4double e50[60] = { 190.1, 232.8, 268.8, 300.5, 329.2, 374.1, 414.4, 450.7, 483.9, 513.5, 540.4, 565.4, 616.5, 659.2, 696, 728.7, 757.6, 783, 805.3, 825.2, 860.1, 890.2, 915.4, 935.4, 950.4, 961.1, 968.2, 972.3, 973.8, 973, 970.2, 965.7, 959.9, 952.8, 906, 850.6, 795.1, 743.3, 696.4, 654.7, 617.9, 585.3, 530.7, 487.1, 451.3, 421.4, 395.9, 373.7, 354.4, 337.2, 321.9, 308.1, 295.7, 284.2, 273.8, 264.1, 225.7, 198.1, 177.1, 160.5 };
    384368 
    385   for(i=0; i<60; i++) {e[50][i]=e50[i]*MeV*cm2/g;}
     369  AddData(T0, e50, 50);
    386370 
    387371  name [51] = "G4_POLYCARBONATE";
    388372  G4double e51[60] = { 164.8, 201.8, 233, 260.5, 285.4, 324.6, 359.7, 391.4, 420.3, 446.2, 469.7, 491.7, 536.5, 574.3, 607.1, 636.2, 662.2, 685.1, 705.4, 723.6, 755.9, 783.9, 807.7, 826.9, 841.7, 852.8, 860.8, 866, 868.8, 869.6, 868.6, 866, 862.1, 857.1, 820.5, 774.5, 727.2, 682.2, 641.1, 604.1, 571.2, 542, 492.3, 452.1, 419.1, 391.8, 368.6, 348.4, 330.7, 314.9, 300.8, 288.1, 276.7, 266.1, 256.5, 247.6, 212, 186.3, 166.8, 151.3 };
    389373 
    390   for(i=0; i<60; i++) {e[51][i]=e51[i]*MeV*cm2/g;}
     374  AddData(T0, e51, 51);
    391375 
    392376  name [52] = "G4_POLYETHYLENE";
    393377  G4double e52[60] = { 184.9, 226.5, 261.5, 292.4, 320.3, 369.9, 413.5, 453, 489.3, 523, 554.8, 584.8, 643.9, 695.3, 740.8, 781.4, 817.9, 850.9, 880.6, 907.5, 953.7, 990.9, 1021, 1044, 1061, 1073, 1081, 1084, 1085, 1083, 1078, 1072, 1064, 1054, 994.1, 927.8, 865, 808.9, 760.1, 717.9, 681.4, 649.7, 591.2, 541, 499.2, 464.9, 436.3, 411.4, 389.8, 370.6, 353.4, 338.1, 324.2, 311.4, 299.8, 289.1, 246.4, 215.9, 192.7, 174.4 };
    394378 
    395   for(i=0; i<60; i++) {e[52][i]=e52[i]*MeV*cm2/g;}
    396  
    397   name [53] = "G4_POLYETHYLENE_TEREPHTHALATE_MYLAR";
     379  AddData(T0, e52, 52);
     380 
     381  name [53] = "G4_MYLAR";
    398382  G4double e53[60] = { 150.9, 184.9, 213.5, 238.7, 261.4, 297.8, 330.2, 359.6, 386.4, 410.5, 432.5, 453, 494.9, 530.3, 561.2, 588.8, 613.4, 635.3, 654.7, 672.3, 703.4, 730.5, 753.5, 772.3, 787, 798.3, 806.6, 812.4, 816, 817.6, 817.4, 815.8, 812.9, 808.9, 777.6, 736.5, 693.4, 651.9, 613.6, 579.1, 548.2, 520.6, 472.9, 434, 402.2, 376.1, 354.3, 335, 318.2, 303.2, 289.8, 277.7, 266.7, 256.6, 247.4, 238.9, 204.8, 180.2, 161.4, 146.5 };
    399383 
    400   for(i=0; i<60; i++) {e[53][i]=e53[i]*MeV*cm2/g;}
    401  
    402   name [54] = "G4_PLEXIGLASS";
     384  AddData(T0, e53, 53);
     385 
     386  name [54] = "G4_PLEXIGLASS";  // POLYMETHYL METHACRALATE (LUCITE, PERSPEX, PLEXIGLASS
    403387  G4double e54[60] = { 174.9, 214.2, 247.4, 276.6, 303, 345.9, 384.1, 418.7, 450.4, 479, 505.2, 529.8, 579.1, 620.8, 657.1, 689.3, 717.9, 743.2, 765.7, 785.8, 820.8, 850.5, 875, 894.5, 909.3, 920.1, 927.4, 931.9, 933.9, 933.7, 931.6, 928, 922.9, 916.8, 874.4, 823.2, 771.3, 722.4, 676.2, 634, 596.2, 562.8, 507.2, 463.4, 428.5, 400.2, 376.7, 356.1, 338, 321.9, 307.5, 294.5, 282.8, 272, 262.1, 253, 216.6, 190.4, 170.3, 154.5 };
    404388 
    405   for(i=0; i<60; i++) {e[54][i]=e54[i]*MeV*cm2/g;}
     389  AddData(T0, e54, 54);
    406390 
    407391  name [55] = "G4_POLYPROPYLENE";
    408392  G4double e55[60] = { 197.6, 242, 279.4, 312.4, 342.2, 395.1, 441.8, 483.9, 522.7, 558.8, 592.7, 624.8, 687.3, 741.3, 789, 831.4, 869.4, 903.6, 934.3, 962, 1009, 1048, 1078, 1101, 1119, 1132, 1140, 1145, 1146, 1145, 1141, 1135, 1128, 1119, 1060, 991.7, 924.3, 862, 806.1, 756.5, 712.8, 674.2, 605.4, 548.6, 503.3, 467.5, 438.7, 413.6, 391.8, 372.4, 355.2, 339.7, 325.7, 312.9, 301.1, 290.4, 247.5, 216.8, 193.5, 175.1 };
    409393 
    410   for(i=0; i<60; i++) {e[55][i]=e55[i]*MeV*cm2/g;}
     394  AddData(T0, e55, 55);
    411395 
    412396  name [56] = "G4_POLYSTYRENE";
    413397  G4double e56[60] = { 186, 227.8, 263.1, 294.1, 322.2, 372.1, 416, 455.7, 492.2, 526.2, 558.1, 588.3, 645.3, 693.8, 735.8, 772.4, 804.5, 832.6, 857.2, 878.7, 913.5, 939.2, 957.2, 969, 975.6, 978, 976.8, 972.8, 966.5, 958.4, 948.9, 938.3, 926.9, 914.9, 851.3, 789.6, 734.2, 685.4, 642.9, 605.7, 573, 543.9, 499.5, 465.2, 435.8, 409.1, 384.6, 363.2, 344.6, 328.1, 313.3, 300, 288, 277, 266.8, 257.5, 220.4, 193.6, 173.2, 157 };
    414398 
    415   for(i=0; i<60; i++) {e[56][i]=e56[i]*MeV*cm2/g;}
     399  AddData(T0, e56, 56);
    416400 
    417401  name [57] = "G4_TEFLON";
    418402  G4double e57[60] = { 83.27, 102, 117.8, 131.7, 144.2, 165, 183.4, 200.1, 215.3, 229.2, 242, 254, 278.7, 300, 319, 336.2, 351.9, 366.1, 379.2, 391.2, 413.1, 432.7, 450, 465.1, 478, 489.1, 498.5, 506.4, 513, 518.4, 522.7, 526, 528.4, 530.1, 528.6, 516.7, 499.4, 479.6, 460.4, 442.3, 425.4, 409.6, 381.2, 356.4, 334.6, 315.4, 298.3, 283.1, 269.6, 257.4, 246.5, 236.5, 227.4, 219.1, 211.5, 204.4, 175.9, 155.2, 139.3, 126.7 };
    419403 
    420   for(i=0; i<60; i++) {e[57][i]=e57[i]*MeV*cm2/g;}
     404  AddData(T0, e57, 57);
    421405 
    422406  name [58] = "G4_POLYVINYL_CHLORIDE";
    423407  G4double e58[60] = { 140.2, 171.7, 198.3, 221.7, 242.8, 277.9, 309, 337.2, 363, 386.4, 408.1, 428.4, 468.9, 503.4, 533.6, 560.3, 584.1, 605.3, 624.1, 640.9, 670.1, 694.5, 714.3, 729.8, 741.4, 749.6, 755, 757.9, 758.6, 757.6, 755, 751, 746, 740, 701.3, 656.7, 612.9, 572.6, 538.7, 509.8, 484.7, 462.4, 424.2, 392.4, 365.3, 341.8, 321.1, 302.9, 287.3, 273.6, 261.3, 250.1, 240.1, 231.1, 222.7, 215, 184.5, 162.6, 145.9, 132.6 };
    424408 
    425   for(i=0; i<60; i++) {e[58][i]=e58[i]*MeV*cm2/g;}
     409  AddData(T0, e58, 58);
    426410
    427411  name [59] = "G4_PROPANE";
    428   G4double e59[60] = { 194.5, 234.7, 268.4, 298, 324.7, 372, 413.6, 451.2, 485.8, 518, 548.2, 576.8, 642.6, 702.2, 756.9, 808, 855.9, 901.2, 944.4, 985.6, 1063, 1135, 1203, 1267, 1327, 1385, 1440, 1492, 1543, 1592, 1639, 1684, 1728, 1770, 1964, 2131, 2277, 2404, 2516, 2613, 2698, 2771, 2887, 2969, 3022, 3053, 3065, 3061, 3046, 3021, 2990, 2953, 2912, 2868, 2822, 2775, 2564, 2372, 2191, 2022 };
    429 
    430   for(i=0; i<60; i++) {e[59][i]=e59[i]*MeV*cm2/g;}
     412  G4double e59[60] = { 2.183E+02, 2.673E+02, 3.087E+02, 3.451E+02, 3.780E+02, 4.365E+02, 4.880E+02, 5.346E+02, 5.775E+02, 6.173E+02, 6.548E+02, 6.902E+02, 7.595E+02, 8.190E+02, 8.714E+02, 9.180E+02, 9.597E+02, 9.970E+02, 1.031E+03, 1.061E+03, 1.112E+03, 1.153E+03, 1.186E+03, 1.211E+03, 1.229E+03, 1.242E+03, 1.250E+03, 1.254E+03, 1.254E+03, 1.252E+03, 1.247E+03, 1.239E+03, 1.230E+03, 1.220E+03, 1.153E+03, 1.078E+03, 1.005E+03, 9.379E+02, 8.769E+02, 8.222E+02, 7.736E+02, 7.305E+02, 6.583E+02, 6.006E+02, 5.537E+02, 5.150E+02, 4.825E+02, 4.542E+02, 4.297E+02, 4.079E+02, 3.886E+02, 3.712E+02, 3.556E+02, 3.413E+02, 3.282E+02, 3.163E+02, 2.687E+02, 2.348E+02, 2.092E+02, 1.890E+02 };
     413
     414  AddData(T0, e59, 59);
    431415
    432416  name [60] = "G4_Pt";
    433   G4double e60[60] = { 30.79, 33.73, 36.43, 38.95, 41.31, 43.55, 48.11, 52.16, 55.83, 59.2, 62.32, 65.23, 67.95, 70.51, 75.22, 79.46, 83.3, 86.79, 89.97, 92.87, 95.51, 97.92, 100.1, 102.1, 103.9, 105.5, 107, 108.3, 112.7, 114.5, 114.4, 113, 110.8, 108.1, 105.3, 102.4, 96.92, 92.12, 87.91, 84.22, 80.97, 78.11, 75.56, 73.26, 71.17, 69.26, 67.5, 65.87, 64.36, 62.94, 57, 52.39, 48.67, 45.57, 42.94, 40.66, 38.67, 36.9, 33.91, 31.45 };
    434 
    435   for(i=0; i<60; i++) {e[60][i]=e60[i]*MeV*cm2/g;}
     417  G4double e60[60] =  { 1.377E+01, 1.687E+01, 1.947E+01, 2.177E+01, 2.385E+01, 2.754E+01, 3.079E+01, 3.373E+01, 3.643E+01, 3.895E+01, 4.131E+01, 4.355E+01, 4.811E+01, 5.216E+01, 5.583E+01, 5.920E+01, 6.232E+01, 6.523E+01, 6.795E+01, 7.051E+01, 7.522E+01, 7.946E+01, 8.330E+01, 8.679E+01, 8.997E+01, 9.287E+01, 9.551E+01, 9.792E+01, 1.001E+02, 1.021E+02, 1.039E+02, 1.055E+02, 1.070E+02, 1.083E+02, 1.127E+02, 1.145E+02, 1.144E+02, 1.130E+02, 1.108E+02, 1.081E+02, 1.053E+02, 1.024E+02, 9.692E+01, 9.212E+01, 8.791E+01, 8.422E+01, 8.097E+01, 7.811E+01, 7.556E+01, 7.326E+01, 7.117E+01, 6.926E+01, 6.750E+01, 6.587E+01, 6.436E+01, 6.294E+01, 5.700E+01, 5.239E+01, 4.867E+01, 4.557E+01 };
     418
     419  AddData(T0, e60, 60);
    436420 
    437421  name [61] = "G4_Si";
    438422  G4double e61[60] = { 105, 128.6, 148.5, 166, 181.8, 210, 234.8, 257.2, 277.8, 296.9, 315, 332, 364.6, 392.5, 416.7, 437.8, 456.3, 472.5, 486.6, 498.9, 518.4, 532.3, 541.6, 547, 549.2, 549, 546.8, 543, 538, 532.2, 525.7, 518.8, 511.7, 504.4, 468.7, 437.3, 410.7, 388.4, 369.4, 353, 338.7, 325.9, 304.1, 285.9, 270.3, 256.7, 245.2, 235.1, 225.9, 217.2, 209, 201.1, 193.6, 187, 180.9, 175.3, 152.3, 135.4, 122.2, 111.7 };
    439423 
    440   for(i=0; i<60; i++) {e[61][i]=e61[i]*MeV*cm2/g;}
     424  AddData(T0, e61, 61);
    441425 
    442426  name [62] = "G4_SILICON_DIOXIDE";
    443427  G4double e62[60] = { 85.64, 104.9, 121.1, 135.4, 148.3, 171.3, 191.5, 209.8, 226.6, 242.2, 256.9, 270.8, 298.1, 322, 343.1, 362.1, 379.3, 394.9, 409.1, 422.1, 444.8, 463.8, 479.7, 492.8, 503.6, 512.3, 519.2, 524.5, 528.5, 531.2, 532.9, 533.7, 533.6, 532.9, 521.9, 503.9, 483.5, 462.8, 442.9, 424.2, 406.7, 390.6, 358.9, 330.8, 307.6, 288.9, 273.6, 259.9, 247.8, 236.9, 227.1, 218.2, 210.1, 202.7, 195.9, 189.7, 164.2, 145.5, 131.1, 119.6 };
    444428 
    445   for(i=0; i<60; i++) {e[62][i]=e62[i]*MeV*cm2/g;}
     429  AddData(T0, e62, 62);
    446430 
    447431  name [63] = "G4_STILBENE";
    448432  G4double e63[60] = { 179.2, 219.5, 253.4, 283.3, 310.4, 352.2, 389.8, 423.8, 454.7, 482.3, 507.2, 530.3, 577.9, 617.7, 652.1, 682.6, 709.7, 733.5, 754.4, 773, 806.1, 835.1, 859.5, 879.2, 894.2, 905.1, 912.7, 917.4, 919.6, 919.6, 917.7, 914.2, 909.3, 903.3, 861.4, 810.7, 759.2, 710.8, 667.1, 628.3, 593.9, 563.4, 511.8, 470.2, 435.9, 407.2, 382.8, 361.4, 342.9, 326.4, 311.6, 298.4, 286.4, 275.4, 265.3, 256.1, 219, 192.4, 172.1, 156.1 };
    449433 
    450   for(i=0; i<60; i++) {e[63][i]=e63[i]*MeV*cm2/g;}
     434  AddData(T0, e63, 63);
    451435 
    452436  name [64] = "G4_Ti";
    453437  G4double e64[60] = { 60.88, 74.56, 86.1, 96.26, 105.4, 121.8, 136.1, 149.1, 161.1, 172.2, 182.6, 192.5, 212.3, 229.6, 245.1, 259.1, 271.8, 283.5, 294.2, 304.1, 321.6, 336.5, 349.1, 359.8, 368.7, 376, 382, 386.7, 390.2, 392.7, 394.4, 395.2, 395.3, 394.8, 385.4, 369.3, 351, 332.6, 315.4, 299.6, 285.5, 272.8, 251.3, 233.9, 219.6, 207.6, 197.4, 188.7, 181, 174.1, 167.9, 162.2, 157, 152.2, 147.7, 143.5, 126, 112.5, 101.7, 93.07 };
    454438 
    455   for(i=0; i<60; i++) {e[64][i]=e64[i]*MeV*cm2/g;}
     439  AddData(T0, e64, 64);
    456440 
    457441  name [65] = "G4_Sn";
    458442  G4double e65[60] = { 32.4, 39.68, 45.82, 51.23, 56.12, 64.8, 72.45, 79.36, 85.72, 91.64, 97.2, 102.5, 113.1, 122.4, 130.8, 138.5, 145.5, 151.9, 157.9, 163.4, 173.4, 182, 189.5, 196, 201.6, 206.4, 210.4, 213.8, 216.5, 218.7, 220.4, 221.6, 222.4, 222.9, 220.7, 213.8, 204.9, 195.4, 186, 177.3, 169.4, 162.3, 150.1, 140.3, 132.2, 125.5, 119.7, 114.7, 110.1, 106.1, 102.5, 99.14, 96.12, 93.34, 90.77, 88.4, 78.69, 71.47, 65.7, 60.79 };
    459443 
    460   for(i=0; i<60; i++) {e[65][i]=e65[i]*MeV*cm2/g;}
     444  AddData(T0, e65, 65);
    461445 
    462446  name [66] = "G4_TISSUE-METHANE";
    463447  G4double e66[60] = { 174.5, 213.8, 246.8, 276, 302.3, 349.1, 390.3, 427.6, 461.8, 493.7, 523.6, 552, 607.8, 656.2, 699.1, 737.4, 771.9, 803, 831.1, 856.5, 900.2, 935.6, 963.8, 985.9, 1003, 1015, 1022, 1027, 1028, 1027, 1023, 1018, 1011, 1002, 947.8, 885.5, 824.9, 769.7, 720.9, 678.2, 641, 608.6, 553.2, 507.9, 470.5, 439.1, 412.4, 389, 368.6, 350.5, 334.4, 319.8, 306.6, 294.6, 283.6, 273.5, 233.2, 204.4, 182.5, 165.2 };
    464448 
    465   for(i=0; i<60; i++) {e[66][i]=e66[i]*MeV*cm2/g;}
     449  AddData(T0, e66, 66);
    466450 
    467451  name [67] = "G4_TISSUE-PROPANE";
    468452  G4double e67[60] = { 169.9, 208.1, 240.3, 268.6, 294.3, 339.8, 379.9, 416.2, 449.5, 480.6, 509.7, 537.3, 591.5, 638.4, 679.9, 716.9, 750.2, 780.2, 807.4, 832, 874.4, 909.1, 937.1, 959.3, 976.6, 989.5, 998.7, 1005, 1008, 1008, 1006, 1003, 998, 991.7, 946.9, 891.9, 836, 783.4, 735.7, 693.2, 655.4, 622, 563.5, 515.3, 475.8, 443.4, 416.2, 392.6, 371.9, 353.6, 337.3, 322.5, 309.3, 297.1, 286, 275.8, 235.1, 206, 183.9, 166.5 };
    469453 
    470   for(i=0; i<60; i++) {e[67][i]=e67[i]*MeV*cm2/g;}
     454  AddData(T0, e67, 67);
    471455 
    472456  name [68] = "G4_TOLUENE";
    473457  G4double e68[60] = { 191.6, 234.7, 271, 302.9, 331.9, 377.2, 417.8, 454.5, 488, 517.9, 545.1, 570.4, 621.9, 665, 702.2, 735.2, 764.3, 790, 812.4, 832.5, 867.7, 897.9, 923.2, 943.3, 958.3, 969, 976, 980, 981.4, 980.4, 977.5, 972.9, 966.9, 959.8, 912.2, 856.2, 800.1, 747.8, 700.6, 658.5, 621.4, 588.5, 535.1, 492.8, 457.8, 427.9, 401.8, 379.1, 359.4, 341.9, 326.3, 312.3, 299.6, 287.9, 277.3, 267.5, 228.5, 200.4, 179.1, 162.3 };
    474458 
    475   for(i=0; i<60; i++) {e[68][i]=e68[i]*MeV*cm2/g;}
     459  AddData(T0, e68, 68);
    476460 
    477461  name [69] = "G4_U";
    478462  G4double e69[60] = { 18.38, 22.51, 25.99, 29.06, 31.83, 36.75, 41.09, 45.01, 48.62, 51.98, 55.13, 58.11, 64.19, 69.57, 74.44, 78.9, 83.02, 86.84, 90.42, 93.78, 99.92, 105.4, 110.3, 114.8, 118.8, 122.4, 125.7, 128.6, 131.2, 133.5, 135.6, 137.4, 139, 140.4, 144.4, 144.8, 142.7, 139.1, 134.5, 129.6, 124.2, 118.8, 108.7, 100, 92.78, 86.72, 81.64, 77.35, 73.71, 70.6, 67.92, 65.59, 63.56, 61.77, 60.19, 58.78, 53.33, 49.08, 45.62, 42.73 };
    479463 
    480   for(i=0; i<60; i++) {e[69][i]=e69[i]*MeV*cm2/g;}
     464  AddData(T0, e69, 69);
    481465 
    482466  name [70] = "G4_W";
    483467  G4double e70[60] = { 14.97, 18.34, 21.17, 23.67, 25.93, 29.94, 33.47, 36.67, 39.61, 42.34, 44.91, 47.34, 52.3, 56.7, 60.68, 64.33, 67.7, 70.84, 73.78, 76.55, 81.61, 86.15, 90.24, 93.95, 97.3, 100.3, 103.1, 105.6, 107.8, 109.9, 111.7, 113.3, 114.7, 116, 120, 121.2, 120.5, 118.5, 115.9, 112.9, 109.8, 106.7, 100.2, 94.14, 89.08, 85, 81.68, 78.78, 76.2, 73.88, 71.78, 69.86, 68.09, 66.45, 64.93, 63.5, 57.52, 52.9, 49.15, 46.04 };
    484468 
    485   for(i=0; i<60; i++) {e[70][i]=e70[i]*MeV*cm2/g;}
     469  AddData(T0, e70, 70);
    486470 
    487471  name [71] = "G4_WATER";
    488472  G4double e71[60] = { 133.7, 163.8, 189.1, 211.4, 231.6, 267.5, 299, 327.6, 353.8, 378.2, 401.2, 422.9, 466, 503.6, 537.2, 567.3, 594.6, 619.5, 642.1, 662.8, 698.9, 729, 753.8, 774, 790.1, 802.6, 811.9, 818.3, 822.3, 824.1, 823.9, 822.2, 819, 814.5, 780.1, 736, 695.9, 660.4, 628.6, 599.9, 573.7, 549.7, 507.5, 471.4, 440.1, 412.8, 388.8, 367.6, 348.9, 332.2, 317.2, 303.7, 291.4, 280.3, 270, 260.6, 222.8, 195.5, 174.8, 158.5 };
    489473 
    490   for(i=0; i<60; i++) {e[71][i]=e71[i]*MeV*cm2/g;}
     474  AddData(T0, e71, 71);
    491475 
    492476  name [72] = "G4_WATER_VAPOR";
    493477  G4double e72[60] = { 152.2, 186.5, 215.3, 240.7, 263.7, 304.5, 340.4, 372.9, 402.8, 430.6, 456.7, 481.4, 530.5, 573.2, 611.3, 645.4, 676.4, 704.4, 730, 753.3, 793.8, 827.4, 855, 877.2, 894.8, 908.2, 918.1, 924.7, 928.5, 929.9, 929.1, 926.5, 922.3, 916.9, 876.3, 825.9, 775.3, 728.5, 686.8, 650.1, 618, 589.9, 536.1, 489.2, 450.8, 420.2, 395.5, 373.8, 354.6, 337.5, 322.2, 308.3, 295.8, 284.4, 273.9, 264.3, 225.7, 198, 176.9, 160.4 };
    494478 
    495   for(i=0; i<60; i++) {e[72][i]=e72[i]*MeV*cm2/g;}
     479  AddData(T0, e72, 72);
    496480 
    497481  name [73] = "G4_Xe";
    498482  G4double e73[60] = { 38.1, 46.67, 53.88, 60.24, 65.99, 76.2, 85.2, 93.33, 100.8, 107.8, 114.3, 120.5, 132.8, 143.6, 153.2, 161.8, 169.6, 176.7, 183.2, 189.1, 199.4, 208, 215, 220.7, 225.2, 228.7, 231.2, 232.9, 233.9, 234.3, 234.1, 233.5, 232.5, 231.1, 221.3, 209.3, 197.4, 186.5, 177, 168.6, 161.3, 155, 144.4, 135.9, 128.8, 122.8, 117.5, 112.7, 108.4, 104.5, 101, 97.75, 94.8, 92.09, 89.6, 87.29, 77.8, 70.52, 64.84, 60.13 };
    499483 
    500   for(i=0; i<60; i++) {e[73][i]=e73[i]*MeV*cm2/g;}
     484  AddData(T0, e73, 73);
    501485}
     486
     487void G4PSTARStopping::AddData(G4double* ekin, G4double* s, G4int idx)
     488{
     489  sdata[idx] = new G4LPhysicsFreeVector(60, ekin[0]*MeV, ekin[59]*MeV);
     490  const G4double fac = MeV*cm2/g;
     491  for(size_t i=0; i<60; ++i) { sdata[idx]->PutValues(i, ekin[i]*MeV, s[i]*fac); }
     492  sdata[idx]->SetSpline(true);
     493}
  • trunk/source/processes/electromagnetic/standard/src/G4UrbanMscModel93.cc

    r1228 r1315  
    1 //
     1// 
    22// ********************************************************************
    33// * License and Disclaimer                                           *
     
    2525//
    2626//
    27 // $Id: G4UrbanMscModel93.cc,v 1.1 2009/11/01 13:05:01 vnivanch Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     27// $Id: G4UrbanMscModel93.cc,v 1.4 2010/05/20 13:17:25 vnivanch Exp $
     28// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2929//
    3030// -------------------------------------------------------------------
    31 //
     31//   
    3232// GEANT4 Class file
    33 //
     33//   
    3434//
    3535// File name:   G4UrbanMscModel93
     
    466466  presafety = sp->GetSafety();
    467467
    468   //G4cout << "G4Urban2::StepLimit tPathLength= "
    469   //     <<tPathLength<<" safety= " << presafety
    470   //       << " range= " <<currentRange<< " lambda= "<<lambda0
    471   //     << " Alg: " << steppingAlgorithm <<G4endl;
     468 // G4cout << "G4Urban2::StepLimit tPathLength= "
     469 //      <<tPathLength<<" safety= " << presafety
     470 //        << " range= " <<currentRange<< " lambda= "<<lambda0
     471 //      << " Alg: " << steppingAlgorithm <<G4endl;
    472472
    473473  // far from geometry boundary
     
    571571      if(tlimit < stepmin) tlimit = stepmin;
    572572
    573       if(tPathLength > tlimit) tPathLength = tlimit  ;
     573      // randomize 1st step or 1st 'normal' step in volume
     574      if((stepStatus == fUndefined) ||
     575         ((smallstep == skin) && !insideskin))
     576        {
     577          G4double temptlimit = tlimit;
     578          if(temptlimit > tlimitmin)
     579          {
     580            do {
     581              temptlimit = G4RandGauss::shoot(tlimit,0.3*tlimit);       
     582               } while ((temptlimit < tlimitmin) ||
     583                        (temptlimit > 2.*tlimit-tlimitmin));
     584          }
     585          else
     586            temptlimit = tlimitmin;
     587          if(tPathLength > temptlimit) tPathLength = temptlimit;
     588        }
     589      else
     590        { 
     591          if(tPathLength > tlimit) tPathLength = tlimit  ;
     592        }
    574593
    575594    }
     
    617636      //lower limit for tlimit
    618637      if(tlimit < tlimitmin) tlimit = tlimitmin;
    619 
     638     
    620639      if(tPathLength > tlimit) tPathLength = tlimit;
     640
    621641    }
    622642 
     
    10021022G4double G4UrbanMscModel93::SampleDisplacement()
    10031023{
     1024  // compute rmean = sqrt(<r**2>) from theory
    10041025  const G4double kappa = 2.5;
    10051026  const G4double kappapl1 = kappa+1.;
    10061027  const G4double kappami1 = kappa-1.;
     1028  // Compute rmean = sqrt(<r**2>) from theory
    10071029  G4double rmean = 0.0;
    10081030  if ((currentTau >= tausmall) && !insideskin) {
     
    10221044  }
    10231045
     1046  if(rmean == 0.) return rmean;
     1047
    10241048  // protection against z > t ...........................
    1025   if(rmean > 0.) {
    1026     G4double zt = (tPathLength-zPathLength)*(tPathLength+zPathLength);
    1027     if(zt <= 0.)
    1028       rmean = 0.;
    1029     else if(rmean*rmean > zt)
    1030       rmean = sqrt(zt);
    1031   }
     1049  G4double rmax = (tPathLength-zPathLength)*(tPathLength+zPathLength);
     1050    if(rmax <= 0.)
     1051      rmax = 0.;
     1052    else
     1053      rmax = sqrt(rmax);
     1054
     1055  if(rmean >= rmax) return rmax;
     1056     
    10321057  return rmean;
     1058  // VI comment out for the time being
     1059  /*
     1060  //sample r (Gaussian distribution with a mean of rmean )
     1061  G4double r = 0.;
     1062  G4double sigma = min(rmean,rmax-rmean);
     1063  sigma /= 3.;
     1064  G4double rlow  = rmean-3.*sigma;
     1065  G4double rhigh = rmean+3.*sigma;
     1066  do {
     1067      r = G4RandGauss::shoot(rmean,sigma); 
     1068     } while ((r < rlow) || (r > rhigh));   
     1069
     1070  return r;
     1071  */
    10331072}
    10341073
  • trunk/source/processes/electromagnetic/standard/src/G4WaterStopping.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4WaterStopping.cc,v 1.18 2009/06/19 10:39:48 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4WaterStopping.cc,v 1.21 2010/04/26 17:44:34 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828
    2929//---------------------------------------------------------------------------
     
    5454{
    5555  spline = splineFlag;
     56  dedx.reserve(17);
    5657  Initialise(corr);
    5758}
     
    6768{
    6869  G4double res = 0.0;
    69   if((iz > 26) || (iz < 3) || (iz > 18 && iz < 26)) return res;
    70   G4bool b;
     70  if((iz > 26) || (iz < 3) || (iz > 18 && iz < 26)) { return res; }
    7171  G4int idx = iz - 3;
    7272  G4double scaledEnergy = energy/A[idx];
    73   G4double emin = 0.025*MeV;
    7473  if(scaledEnergy < emin) {
    75     res = (dedx[idx])->GetValue(emin, b)*std::sqrt(scaledEnergy/emin);
     74    res = (*(dedx[idx]))[0]*std::sqrt(scaledEnergy/emin);
    7675  } else {
    77     res = (dedx[idx])->GetValue(scaledEnergy, b);
     76    res = (dedx[idx])->Value(scaledEnergy);
    7877  }
    7978  return res;
     
    8584                              G4double factor)
    8685{
    87   G4LPhysicsFreeVector* pv = new G4LPhysicsFreeVector(53,energy[0],energy[52]);
     86  G4LPhysicsFreeVector* pv = new G4LPhysicsFreeVector(53,energy[0]*MeV,energy[52]*MeV);
    8887  pv->SetSpline(spline);
    8988  dedx.push_back(pv);
    90   for(G4int i=0;i<53;i++) {
    91     pv->PutValues(i,energy[i],stoppower[i]*factor);
     89  for(G4int i=0; i<53; ++i) {
     90    pv->PutValues(i,energy[i]*MeV,stoppower[i]*factor);
    9291  }
    9392}
     
    101100  G4int zz[17] = {3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,18,26};
    102101  G4int aa[17] = {7, 9, 11, 12, 14, 16, 19, 20, 23, 24, 27, 28,31,32, 35,40,56};
    103   // G4double A_Ion[17] = {6.941,9.0122,10.811,12.011,14.007,15.999,18.998,20.180,22.990,24.305,26.982,28.086,30.974,32.065,35.453,39.948,55.845};
    104   for(i=0; i<17; i++) {
     102  for(i=0; i<17; ++i) {
    105103    Z[i] = zz[i];
    106104    A[i] = G4double(aa[i]);
     
    108106  //..Reduced energies
    109107  G4double E[53] = {0.025,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1,0.15,0.2,0.25,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.5,2,2.5,3,4,5,6,7,8,9,10,15,20,25,30,40,50,60,70,80,90,100,150,200,250,300,400,500,600,700,800,900,1000};
    110   for(i=0; i<53; i++) {E[i] *= MeV;}
    111 
     108  emin   = E[0]*MeV;
    112109  G4double factor = 1000.*MeV/cm;
    113110
     
    149146
    150147  if(corr) {
    151     for(i=0; i<17; i++) {corr->AddStoppingData(Z[i], aa[i], "G4_WATER", dedx[i]);}
     148    for(i=0; i<17; ++i) {corr->AddStoppingData(Z[i], aa[i], "G4_WATER", dedx[i]);}
    152149  }
    153150}
  • trunk/source/processes/electromagnetic/standard/src/G4WentzelVIModel.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4WentzelVIModel.cc,v 1.37 2009/10/28 10:14:13 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4WentzelVIModel.cc,v 1.60 2010/06/01 11:13:31 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    3939//
    4040// Modifications:
     41// 27-05-2010 V.Ivanchenko added G4WentzelOKandVIxSection class to
     42//              compute cross sections and sample scattering angle
    4143//
    4244//
     
    5759#include "G4WentzelVIModel.hh"
    5860#include "Randomize.hh"
    59 #include "G4LossTableManager.hh"
    6061#include "G4ParticleChangeForMSC.hh"
    6162#include "G4PhysicsTableHelper.hh"
    6263#include "G4ElementVector.hh"
    6364#include "G4ProductionCutsTable.hh"
    64 #include "G4PhysicsLogVector.hh"
    65 #include "G4Electron.hh"
    66 #include "G4Positron.hh"
    67 #include "G4Proton.hh"
    68 
    69 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    70 
    71 G4double G4WentzelVIModel::ScreenRSquare[] = {0.0};
    72 G4double G4WentzelVIModel::FormFactor[]    = {0.0};
     65#include "G4LossTableManager.hh"
     66#include "G4Pow.hh"
     67
     68//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    7369
    7470using namespace std;
     
    7773  G4VMscModel(nam),
    7874  theLambdaTable(0),
    79   theLambda2Table(0),
    80   numlimit(0.2),
    81   nbins(60),
    82   nwarnings(0),
    83   nwarnlimit(50),
     75  numlimit(0.1),
    8476  currentCouple(0),
    8577  cosThetaMin(1.0),
    86   q2Limit(TeV*TeV),
    87   alpha2(fine_structure_const*fine_structure_const),
    8878  isInitialized(false),
    8979  inside(false)
     
    9181  invsqrt12 = 1./sqrt(12.);
    9282  tlimitminfix = 1.e-6*mm;
    93   theManager = G4LossTableManager::Instance();
    94   fNistManager = G4NistManager::Instance();
    95   theElectron = G4Electron::Electron();
    96   thePositron = G4Positron::Positron();
    97   theProton   = G4Proton::Proton();
    98   lowEnergyLimit = 0.1*keV;
    99   G4double p0 = electron_mass_c2*classic_electr_radius;
    100   coeff  = twopi*p0*p0;
    101   tkin = targetZ = mom2 = DBL_MIN;
    102   ecut = etag = DBL_MAX;
     83  lowEnergyLimit = 1.0*eV;
    10384  particle = 0;
    10485  nelments = 5;
    10586  xsecn.resize(nelments);
    10687  prob.resize(nelments);
    107 
    108   // Thomas-Fermi screening radii
    109   // Formfactors from A.V. Butkevich et al., NIM A 488 (2002) 282
    110 
    111   if(0.0 == ScreenRSquare[0]) {
    112     G4double a0 = electron_mass_c2/0.88534;
    113     G4double constn = 6.937e-6/(MeV*MeV);
    114 
    115     ScreenRSquare[0] = alpha2*a0*a0;
    116     for(G4int j=1; j<100; j++) {
    117       G4double x = a0*fNistManager->GetZ13(j);
    118       ScreenRSquare[j] = alpha2*x*x;
    119       x = fNistManager->GetA27(j);
    120       FormFactor[j] = constn*x*x;
    121     }
    122   }
     88  theManager = G4LossTableManager::Instance();
     89  fG4pow = G4Pow::GetInstance();
     90  wokvi = new G4WentzelOKandVIxSection();
    12391}
    12492
     
    12694
    12795G4WentzelVIModel::~G4WentzelVIModel()
    128 {}
     96{
     97  delete wokvi;
     98}
    12999
    130100//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
     
    135105  // reset parameters
    136106  SetupParticle(p);
    137   tkin = targetZ = mom2 = 0.0;
    138   ecut = etag = DBL_MAX;
    139107  currentRange = 0.0;
    140108  cosThetaMax = cos(PolarAngleLimit());
     109  wokvi->Initialise(p, cosThetaMax);
     110  /*
     111  G4cout << "G4WentzelVIModel: factorA2(GeV^2) = " << factorA2/(GeV*GeV)
     112         << "  1-cos(ThetaLimit)= " << 1 - cosThetaMax
     113         << G4endl;
     114  */
    141115  currentCuts = &cuts;
    142116
     
    157131                             G4double cutEnergy, G4double)
    158132{
    159   SetupParticle(p);
    160   if(kinEnergy < lowEnergyLimit) return 0.0;
    161   SetupKinematic(kinEnergy, cutEnergy);
    162   SetupTarget(Z, kinEnergy);
    163   G4double xsec = ComputeTransportXSectionPerAtom();
    164   /*   
    165   G4cout << "CS: e= " << tkin << " cosEl= " << cosTetMaxElec2
    166          << " cosN= " << cosTetMaxNuc2 << " xsec(bn)= " << xsec/barn
    167          << " " << particle->GetParticleName() << G4endl;
     133  G4double xsec = 0.0;
     134  if(p != particle) { SetupParticle(p); }
     135  if(kinEnergy < lowEnergyLimit) { return xsec; }
     136  DefineMaterial(CurrentCouple());
     137  cosTetMaxNuc = wokvi->SetupKinematic(kinEnergy, currentMaterial);
     138  if(cosTetMaxNuc < 1.0) {
     139    cosTetMaxNuc = wokvi->SetupTarget(G4int(Z), cutEnergy);
     140    xsec = wokvi->ComputeTransportCrossSectionPerAtom(cosTetMaxNuc);
     141  /*     
     142    G4cout << "G4WentzelVIModel::CS: Z= " << G4int(Z) << " e(MeV)= " << kinEnergy
     143           << " 1-cosN= " << 1 - costm << " xsec(bn)= " << xsec/barn
     144           << " " << particle->GetParticleName() << G4endl;
    168145  */
     146  }
    169147  return xsec;
    170 }
    171 
    172 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    173 
    174 G4double G4WentzelVIModel::ComputeTransportXSectionPerAtom()
    175 {
    176   G4double xSection = 0.0;
    177   G4double x, y, x1, x2, x3, x4;
    178 
    179   // scattering off electrons
    180   if(cosTetMaxElec2 < 1.0) {
    181     x = (1.0 - cosTetMaxElec2)/screenZ;
    182     if(x < numlimit) y = 0.5*x*x*(1.0 - 1.3333333*x + 1.5*x*x);
    183     else             y = log(1.0 + x) - x/(1.0 + x);
    184     if(y < 0.0) {
    185       nwarnings++;
    186       if(nwarnings < nwarnlimit /*&& y < -1.e-10*/) {
    187         G4cout << "Electron scattering <0 for L1 " << y
    188                << " e(MeV)= " << tkin << " p(MeV/c)= " << sqrt(mom2)
    189                << " Z= " << targetZ << "  "
    190                << particle->GetParticleName() << G4endl;
    191         G4cout << " z= " << 1.0-cosTetMaxElec2 << " screenZ= " << screenZ
    192                << " x= " << x << G4endl;
    193       }
    194       y = 0.0;
    195     }
    196     xSection = y;
    197   }
    198   /* 
    199   G4cout << "G4WentzelVI:XS per A " << " Z= " << targetZ
    200          << " e(MeV)= " << tkin/MeV << " XSel= " << xSection
    201          << " cut(MeV)= " << ecut/MeV 
    202          << " zmaxE= " << (1.0 - cosTetMaxElec)/screenZ
    203          << " zmaxN= " << (1.0 - cosTetMaxNuc2)/screenZ
    204          << " costm= " << cosTetMaxNuc2 << G4endl;
    205   */
    206   // scattering off nucleus
    207   if(cosTetMaxNuc2 < 1.0) {
    208     x  = 1.0 - cosTetMaxNuc2;
    209     x1 = screenZ*formfactA;
    210     x2 = 1.0 - x1;
    211     x3 = x/screenZ;
    212     x4 = formfactA*x;
    213     // low-energy limit
    214     if(x3 < numlimit && x1 < numlimit) {
    215       y = 0.5*x3*x3*(1.0 - 1.3333333*x3 + 1.5*x3*x3 - 1.5*x1
    216                      + 3.0*x1*x1 + 2.666666*x3*x1)/(x2*x2*x2);
    217       // high energy limit
    218     } else if(x2 <= 0.0) {
    219       x4 = x1*(1.0 + x3);
    220       y  = x3*(1.0 + 0.5*x3 - (2.0 - x1)*(1.0 + x3 + x3*x3/3.0)/x4)/(x4*x4);
    221       // middle energy
    222     } else {
    223       y = ((1.0 + x1)*x2*log((1. + x3)/(1. + x4))
    224            - x3/(1. + x3) - x4/(1. + x4))/(x2*x2);
    225     }
    226     //G4cout << "y= " << y << " x1= " <<x1<<"  x2= " <<x2
    227     //     <<"  x3= "<<x3<<"  x4= " << x4<<G4endl;
    228     if(y < 0.0) {
    229       nwarnings++;
    230       if(nwarnings < nwarnlimit /*&& y < -1.e-10*/) {
    231         G4cout << "Nuclear scattering <0 for L1 " << y
    232                << " e(MeV)= " << tkin << " Z= " << targetZ << "  "
    233                << particle->GetParticleName() << G4endl;
    234         G4cout << " formfactA= " << formfactA << " screenZ= " << screenZ
    235                << " x= " << " x1= " << x1 << " x2= " << x2
    236                << " x3= " << x3 << " x4= " << x4 <<G4endl;
    237       }
    238       y = 0.0;
    239     }
    240     xSection += y*targetZ;
    241   }
    242   xSection *= kinFactor;
    243   /*
    244   G4cout << "Z= " << targetZ << " XStot= " << xSection/barn
    245          << " screenZ= " << screenZ << " formF= " << formfactA
    246          << " for " << particle->GetParticleName()
    247          << " m= " << mass << " 1/v= " << sqrt(invbeta2) << " p= " << sqrt(mom2)
    248          << " x= " << x
    249          << G4endl;
    250   */
    251   return xSection;
    252148}
    253149
     
    263159  G4StepPoint* sp = track.GetStep()->GetPreStepPoint();
    264160  G4StepStatus stepStatus = sp->GetStepStatus();
     161  //G4cout << "G4WentzelVIModel::ComputeTruePathLengthLimit stepStatus= "
     162  //     << stepStatus << G4endl;
    265163
    266164  // initialisation for 1st step 
     
    268166    inside = false;
    269167    SetupParticle(dp->GetDefinition());
    270     theLambdaTable = theTable;
    271168  }
    272169
     
    274171  preKinEnergy  = dp->GetKineticEnergy();
    275172  DefineMaterial(track.GetMaterialCutsCouple());
    276   lambda0 = GetLambda(preKinEnergy);
     173  theLambdaTable = theTable;
     174  lambdaeff = GetLambda(preKinEnergy);
    277175  currentRange =
    278176    theManager->GetRangeFromRestricteDEDX(particle,preKinEnergy,currentCouple);
     177  cosTetMaxNuc = wokvi->SetupKinematic(preKinEnergy, currentMaterial);
    279178
    280179  // extra check for abnormal situation
    281180  // this check needed to run MSC with eIoni and eBrem inactivated
    282   if(tlimit > currentRange) tlimit = currentRange;
     181  if(tlimit > currentRange) { tlimit = currentRange; }
    283182
    284183  // stop here if small range particle
    285   if(inside) return tlimit;   
     184  if(inside) { return tlimit; }
    286185
    287186  // pre step
     
    290189  // compute presafety again if presafety <= 0 and no boundary
    291190  // i.e. when it is needed for optimization purposes
    292   if(stepStatus != fGeomBoundary && presafety < tlimitminfix)
     191  if(stepStatus != fGeomBoundary && presafety < tlimitminfix) {
    293192    presafety = ComputeSafety(sp->GetPosition(), tlimit);
     193  }
    294194  /*
    295   G4cout << "G4WentzelVIModel::ComputeTruePathLengthLimit tlimit= "
    296          <<tlimit<<" safety= " << presafety
    297          << " range= " <<currentRange<<G4endl;
     195  G4cout << "e(MeV)= " << preKinEnergy/MeV
     196         << "  " << particle->GetParticleName()
     197         << " CurLimit(mm)= " << tlimit/mm <<" safety(mm)= " << presafety/mm
     198         << " R(mm)= " <<currentRange/mm
     199         << " L0(mm^-1)= " << lambdaeff*mm
     200         <<G4endl;
    298201  */
    299202  // far from geometry boundary
    300203  if(currentRange < presafety) {
    301204    inside = true; 
    302    
    303     // limit mean scattering angle
    304   } else {
    305     G4double rlimit = facrange*lambda0;
    306     G4double rcut = currentCouple->GetProductionCuts()->GetProductionCut(1);
    307     if(rcut > rlimit) rlimit = std::pow(rcut*rcut*rlimit,0.33333333);
    308     rlimit = std::min(rlimit, facgeom*currentMaterial->GetRadlen());
    309     if(rlimit < tlimit) tlimit = rlimit;
    310   }
    311   /*
     205    return tlimit;
     206  }
     207
     208  // natural limit for high energy
     209  G4double rlimit = std::max(facrange*currentRange,
     210                             0.7*(1.0 - cosTetMaxNuc)*lambdaeff);
     211
     212  // low-energy e-
     213  if(cosThetaMax > cosTetMaxNuc) {
     214    rlimit = std::min(rlimit, facsafety*presafety);
     215  }
     216   
     217  // cut correction
     218  G4double rcut = currentCouple->GetProductionCuts()->GetProductionCut(1);
     219  //G4cout << "rcut= " << rcut << " rlimit= " << rlimit << " presafety= " << presafety
     220  // << " 1-cosThetaMax= " <<1-cosThetaMax << " 1-cosTetMaxNuc= " << 1-cosTetMaxNuc
     221  // << G4endl;
     222  if(rcut > rlimit) { rlimit = std::min(rlimit, rcut*sqrt(rlimit/rcut)); }
     223
     224  if(rlimit < tlimit) { tlimit = rlimit; }
     225
     226  tlimit = std::max(tlimit, tlimitminfix);
     227
     228  // step limit in infinite media
     229  tlimit = std::min(tlimit, 20*currentMaterial->GetRadlen());
     230  /* 
    312231  G4cout << particle->GetParticleName() << " e= " << preKinEnergy
    313          << " L0= " << lambda0 << " R= " << currentRange
     232         << " L0= " << lambdaeff << " R= " << currentRange
    314233         << "tlimit= " << tlimit 
    315234         << " currentMinimalStep= " << currentMinimalStep << G4endl;
     
    324243  tPathLength  = truelength;
    325244  zPathLength  = tPathLength;
    326   lambdaeff    = lambda0;
    327 
    328   if(lambda0 > 0.0) {
    329     G4double tau = tPathLength/lambda0;
     245
     246  if(lambdaeff > 0.0) {
     247    G4double tau = tPathLength/lambdaeff;
    330248    //G4cout << "ComputeGeomPathLength: tLength= " << tPathLength
    331     //   << " lambda0= " << lambda0 << " tau= " << tau << G4endl;
     249    //   << " Leff= " << lambdaeff << " tau= " << tau << G4endl;
    332250    // small step
    333251    if(tau < numlimit) {
     
    336254      // medium step
    337255    } else {
    338       //      zPathLength = lambda0*(1.0 - exp(-tPathLength/lambda0));
    339256      G4double e1 = 0.0;
    340257      if(currentRange > tPathLength) {
     
    343260                                   currentCouple);
    344261      }
    345       lambdaeff = GetLambda(0.5*(e1 + preKinEnergy));
     262      e1 = 0.5*(e1 + preKinEnergy);
     263      cosTetMaxNuc = wokvi->SetupKinematic(e1, currentMaterial);
     264      lambdaeff = GetLambda(e1);
    346265      zPathLength = lambdaeff*(1.0 - exp(-tPathLength/lambdaeff));
    347266    }
     
    355274G4double G4WentzelVIModel::ComputeTrueStepLength(G4double geomStepLength)
    356275{
    357   // step defined other than transportation
    358   if(geomStepLength == zPathLength) return tPathLength;
     276  // initialisation of single scattering x-section
     277  xtsec = 0.0;
     278
     279  // pathalogical case
     280  if(lambdaeff <= 0.0) {
     281    zPathLength = geomStepLength;
     282    tPathLength = geomStepLength;
     283    return tPathLength;
     284  }
     285
     286  G4double tau = geomStepLength/lambdaeff;
    359287
    360288  // step defined by transportation
    361   tPathLength  = geomStepLength;
    362   zPathLength  = geomStepLength;
    363   G4double tau = zPathLength/lambdaeff;
    364   tPathLength *= (1.0 + 0.5*tau + tau*tau/3.0);
    365 
    366   if(tau > numlimit) {
    367     G4double e1 = 0.0;
    368     if(currentRange > tPathLength) {
    369       e1 = theManager->GetEnergy(particle,
    370                                  currentRange-tPathLength,
    371                                  currentCouple);
    372     }
    373     lambdaeff = GetLambda(0.5*(e1 + preKinEnergy));
    374     tau = zPathLength/lambdaeff;
    375 
    376     if(tau < 0.999999) tPathLength = -lambdaeff*log(1.0 - tau);
    377     else               tPathLength = currentRange;
    378 
    379     if(tPathLength < zPathLength) tPathLength = zPathLength;
    380   }
    381   if(tPathLength > currentRange) tPathLength = currentRange;
    382   //G4cout<<"Comp.true: zLength= "<<zPathLength<<" tLength= "<<tPathLength<<G4endl;
     289  if(geomStepLength != zPathLength) {
     290
     291    // step defined by transportation
     292    zPathLength = geomStepLength;
     293    tPathLength = zPathLength*(1.0 + 0.5*tau + tau*tau/3.0);
     294
     295    // energy correction for a big step
     296    if(tau > numlimit) {
     297      G4double e1 = 0.0;
     298      if(currentRange > tPathLength) {
     299        e1 = theManager->GetEnergy(particle,
     300                                   currentRange-tPathLength,
     301                                   currentCouple);
     302      }
     303      e1 = 0.5*(e1 + preKinEnergy);
     304      cosTetMaxNuc = wokvi->SetupKinematic(e1, currentMaterial);
     305      lambdaeff = GetLambda(e1);
     306      tau = zPathLength/lambdaeff;
     307     
     308      if(tau < 0.999999) { tPathLength = -lambdaeff*log(1.0 - tau); }
     309      else               { tPathLength = currentRange; }
     310    }
     311  }
     312
     313  // check of step length
     314  // define threshold angle between single and multiple scattering
     315  cosThetaMin = 1.0 - 1.5*tPathLength/lambdaeff;
     316
     317  // recompute transport cross section - do not change energy
     318  // anymore - cannot be applied for big steps
     319  if(cosThetaMin > cosTetMaxNuc) {
     320
     321    // new computation
     322    G4double xsec = ComputeXSectionPerVolume();
     323    //G4cout << "%%%% xsec= " << xsec << "  xtsec= " << xtsec << G4endl;
     324    if(xtsec > 0.0) {
     325      if(xsec > 0.0) { lambdaeff = 1./xsec; }
     326      else           { lambdaeff = DBL_MAX; }
     327
     328      tau = zPathLength*xsec;
     329      if(tau < numlimit) { tPathLength = zPathLength*(1.0 + 0.5*tau + tau*tau/3.0); }
     330      else if(tau < 0.999999) { tPathLength = -lambdaeff*log(1.0 - tau); }
     331      else               { tPathLength = currentRange; }
     332    }
     333  }
     334
     335  if(tPathLength > currentRange) { tPathLength = currentRange; }
     336  if(tPathLength < zPathLength)  { tPathLength = zPathLength; }
     337  /*   
     338  G4cout <<"Comp.true: zLength= "<<zPathLength<<" tLength= "<<tPathLength
     339         <<" Leff(mm)= "<<lambdaeff/mm<<" sig0(1/mm)= " << xtsec <<G4endl;
     340  G4cout << particle->GetParticleName() << " 1-cosThetaMin= " << 1-cosThetaMin
     341         << " 1-cosTetMaxNuc= " << 1-cosTetMaxNuc
     342         << " e(MeV)= " << preKinEnergy/MeV << G4endl;
     343  */
    383344  return tPathLength;
    384345}
     
    391352  //G4cout << "!##! G4WentzelVIModel::SampleScattering for "
    392353  //     << particle->GetParticleName() << G4endl;
    393   G4double kinEnergy = dynParticle->GetKineticEnergy();
    394 
    395   // ignore scattering for zero step length and enegy below the limit
    396   if(kinEnergy < lowEnergyLimit || tPathLength <= DBL_MIN) return;
    397 
    398   G4double ekin = preKinEnergy;
    399   if(ekin - kinEnergy > ekin*dtrl) {
    400     ekin = 0.5*(preKinEnergy + kinEnergy);
    401     lambdaeff = GetLambda(ekin);
    402   } 
     354
     355  // ignore scattering for zero step length and energy below the limit
     356  if(dynParticle->GetKineticEnergy() < lowEnergyLimit ||
     357     tPathLength <= DBL_MIN || lambdaeff <= DBL_MIN)
     358    { return; }
    403359 
    404   G4double x1 = 0.5*tPathLength/lambdaeff;
    405   G4double cut= (*currentCuts)[currentMaterialIndex];
    406   /* 
    407   G4cout <<"SampleScat: E0(MeV)= "<< preKinEnergy<<" Eeff(MeV)= "<<ekin/MeV
    408          << " L0= " << lambda0 << " Leff= " << lambdaeff
    409          << " x1= " << x1 << " safety= " << safety << G4endl;
     360  G4double invlambda = 0.0;
     361  if(lambdaeff < DBL_MAX) { invlambda = 0.5/lambdaeff; }
     362
     363  // use average kinetic energy over the step
     364  G4double cut = (*currentCuts)[currentMaterialIndex];
     365  /*     
     366  G4cout <<"SampleScat: E0(MeV)= "<< preKinEnergy/MeV
     367         << " Leff= " << lambdaeff <<" sig0(1/mm)= " << xtsec
     368         << " x1= " <<  tPathLength*invlambda << " safety= " << safety << G4endl;
    410369  */
    411370
    412   G4double xsec = 0.0;
    413   G4bool largeAng = false;
    414 
    415   // large scattering angle case
    416   if(x1 > 0.5) {
    417     x1 *= 0.5;
    418     largeAng = true;
    419 
    420     // normal case
    421   } else {
    422 
    423     // define threshold angle between single and multiple scattering
    424     cosThetaMin = 1.0 - 3.0*x1;
    425 
    426     // for low-energy e-,e+ no limit
    427     SetupKinematic(ekin, cut);
    428  
    429     // recompute transport cross section
    430     if(cosThetaMin > cosTetMaxNuc) {
    431 
    432       xsec = ComputeXSectionPerVolume();
    433 
    434       if(xtsec > 0.0) x1 = 0.5*tPathLength*xtsec;
    435       else            x1 = 0.0;
    436 
    437       /*     
    438         G4cout << "cosTetMaxNuc= " << cosTetMaxNuc
    439         << " cosThetaMin= " << cosThetaMin
    440         << " cosThetaMax= " << cosThetaMax
    441         << " cosTetMaxElec2= " << cosTetMaxElec2 << G4endl;
    442         G4cout << "Recomputed xsec(1/mm)= " << xsec << " x1= " << x1 << G4endl;
    443       */
    444     }
    445   }
    446 
    447   // result of central part sampling
    448   G4double z;
     371  G4double length = tPathLength;
     372  G4double lengthlim = tPathLength*1.e-6;
     373
     374  // step limit due msc
     375  G4double x0 = length;
     376  // large scattering angle case - two step approach
     377  if(tPathLength*invlambda > 0.5 && length > tlimitminfix) { x0 *= 0.5; }
     378
     379  // step limit due single scattering
     380  G4double x1 = length;
     381  if(xtsec > 0.0) { x1 = -log(G4UniformRand())/xtsec; }
     382
     383  const G4ElementVector* theElementVector =
     384    currentMaterial->GetElementVector();
     385  G4int nelm = currentMaterial->GetNumberOfElements();
     386
     387  // geometry
     388  G4double sint, cost, phi;
     389  G4ThreeVector oldDirection = dynParticle->GetMomentumDirection();
     390  G4ThreeVector temp(0.0,0.0,1.0);
     391
     392  // current position and direction relative to the end point
     393  // because of magnetic field geometry is computed relatively to the
     394  // end point of the step
     395  G4ThreeVector dir(0.0,0.0,1.0);
     396  G4ThreeVector pos(0.0,0.0,-zPathLength);
     397  G4double mscfac = zPathLength/tPathLength;
     398
     399  // start a loop
    449400  do {
    450     z = -x1*log(G4UniformRand());
    451   } while (z > 1.0);
    452 
    453   // cost is sampled ------------------------------
    454   G4double cost = 1.0 - 2.0*z;
    455   //  if(cost < -1.0) cost = -1.0;
    456   // else if(cost > 1.0) cost = 1.0;
    457   G4double sint = sqrt((1.0 - cost)*(1.0 + cost));
    458 
    459   G4double phi  = twopi*G4UniformRand();
    460 
    461   G4double dirx = sint*cos(phi);
    462   G4double diry = sint*sin(phi);
    463  
    464   //G4cout << "G4WentzelVIModel: step(mm)= " << tPathLength/mm
    465   //     << " sint= " << sint << " cost= " << cost<< G4endl;
    466  
    467   G4ThreeVector oldDirection = dynParticle->GetMomentumDirection();
    468   G4ThreeVector newDirection(dirx,diry,cost);
    469   G4ThreeVector temp(0.0,0.0,1.0);
    470   G4ThreeVector pos(0.0,0.0,-zPathLength);
    471   G4ThreeVector dir(0.0,0.0,1.0);
    472   G4bool isscat = false;
    473 
    474   // sample MSC scattering for large angle
    475   // extra central scattering for half step
    476   if(largeAng) {
    477     isscat = true;
    478     pos.setZ(-0.5*zPathLength);
    479     do {
    480       z = -x1*log(G4UniformRand());
    481     } while (z > 1.0);
     401    G4double step = x0;
     402    G4bool singleScat = false;
     403
     404    // single scattering case
     405    if(x1 < x0) {
     406      step = x1;
     407      singleScat = true;
     408    }
     409
     410    // new position
     411    pos += step*mscfac*dir;
     412
     413    // added multiple scattering
     414    G4double z;
     415    G4double tet2 = step*invlambda; 
     416    do { z = -tet2*log(G4UniformRand()); } while (z >= 1.0);
     417
    482418    cost = 1.0 - 2.0*z;
    483     //if(std::fabs(cost) > 1.0) cost = 1.0;
    484 
    485419    sint = sqrt((1.0 - cost)*(1.0 + cost));
    486420    phi  = twopi*G4UniformRand();
    487 
    488     // position and direction for secondary scattering
    489     dir.set(sint*cos(phi),sint*sin(phi),cost);
    490     pos += 0.5*dir*zPathLength;
    491     x1 *= 2.0;
    492   }
    493 
    494   // sample Rutherford scattering for large angle
    495   if(xsec > DBL_MIN) {
    496     G4double t = tPathLength;
    497     G4int nelm = currentMaterial->GetNumberOfElements();
    498     const G4ElementVector* theElementVector =
    499       currentMaterial->GetElementVector();
    500     do{
    501       G4double x  = -log(G4UniformRand())/xsec;     
    502       pos += dir*(zPathLength*std::min(x,t)/tPathLength);
    503       t -= x;
    504       if(t > 0.0) {
    505         G4double zz1 = 1.0;
    506         G4double qsec = G4UniformRand()*xsec;
    507 
    508         // scattering off nucleus
    509         G4int i = 0;
    510         if(nelm > 1) {
    511           for (; i<nelm; i++) {if(xsecn[i] >= qsec) break;}
    512           if(i >= nelm) i = nelm - 1;
    513         }
    514         SetupTarget((*theElementVector)[i]->GetZ(), tkin);
    515         G4double formf = formfactA;
    516         G4double costm = cosTetMaxNuc2;
    517         if(prob[i] > 0.0) {
    518           if(G4UniformRand() <= prob[i]) {
    519             formf = 0.0;
    520             costm = cosTetMaxElec2;
    521           }
    522         }
    523         if(cosThetaMin > costm) {
    524 
    525           G4double w1 = 1. - cosThetaMin + screenZ;
    526           G4double w2 = 1. - costm + screenZ;
    527           G4double w3 = cosThetaMin - costm;
    528           G4double grej, zz;
    529           do {
    530             zz = w1*w2/(w1 + G4UniformRand()*w3) - screenZ;
    531             grej = 1.0/(1.0 + formf*zz);
    532           } while ( G4UniformRand() > grej*grej ); 
    533           if(zz < 0.0) zz = 0.0;
    534           else if(zz > 2.0) zz = 2.0;
    535           zz1 = 1.0 - zz;
    536         }
    537         if(zz1 < 1.0) {
    538           isscat = true;
    539           //G4cout << "Rutherford zz1= " << zz1 << " t= " << t << G4endl;
    540           sint = sqrt((1.0 - zz1)*(1.0 + zz1));
    541           //G4cout << "sint= " << sint << G4endl;
    542           phi  = twopi*G4UniformRand();
    543           G4double vx1 = sint*cos(phi);
    544           G4double vy1 = sint*sin(phi);
    545           temp.set(vx1,vy1,zz1);
    546           temp.rotateUz(dir);
    547           dir = temp;
    548         }
     421    G4double vx1 = sint*cos(phi);
     422    G4double vy1 = sint*sin(phi);
     423
     424    // lateral displacement 
     425    if (latDisplasment && safety > tlimitminfix) {
     426      G4double rms = invsqrt12*sqrt(2.0*tet2);
     427      G4double dx = step*(0.5*vx1 + rms*G4RandGauss::shoot(0.0,1.0));
     428      G4double dy = step*(0.5*vy1 + rms*G4RandGauss::shoot(0.0,1.0));
     429      G4double dz;
     430      G4double d = (dx*dx + dy*dy)/(step*step);
     431      if(d < numlimit)  { dz = -0.5*step*d*(1.0 + 0.25*d); }
     432      else if(d < 1.0)  { dz = -step*(1.0 - sqrt(1.0 - d));}
     433      else              { dx = dy = dz = 0.0; }
     434
     435      // change position
     436      temp.set(dx,dy,dz);
     437      temp.rotateUz(dir);
     438      pos += temp;
     439    }
     440
     441    // direction is changed
     442    temp.set(vx1,vy1,cost);
     443    temp.rotateUz(dir);
     444    dir = temp;
     445
     446    if(singleScat) {
     447
     448      // select element
     449      G4int i = 0;
     450      if(nelm > 1) {
     451        G4double qsec = G4UniformRand()*xtsec;
     452        for (; i<nelm; ++i) { if(xsecn[i] >= qsec) { break; } }
     453        if(i >= nelm) { i = nelm - 1; }
    549454      }
    550     } while (t > 0.0);
    551   }
    552   if(isscat) newDirection.rotateUz(dir);
    553   newDirection.rotateUz(oldDirection);
     455      G4double cosTetM =
     456        wokvi->SetupTarget(G4int((*theElementVector)[i]->GetZ()), cut);
     457      temp = wokvi->SampleSingleScattering(cosThetaMin, cosTetM, prob[i]);
     458      temp.rotateUz(dir);
     459
     460      // renew direction
     461      dir = temp;
     462
     463      // new single scatetring
     464      x1 = -log(G4UniformRand())/xtsec;
     465    }
     466
     467    // update step
     468    length -= step;
     469
     470  } while (length > lengthlim);
     471   
     472  dir.rotateUz(oldDirection);
     473  pos.rotateUz(oldDirection);
    554474
    555475  //G4cout << "G4WentzelVIModel sampling of scattering is done" << G4endl;
    556476  // end of sampling -------------------------------
    557477
    558   fParticleChange->ProposeMomentumDirection(newDirection);
    559 
    560   if (latDisplasment && safety > tlimitminfix) {
    561     G4double rms = invsqrt12*sqrt(2.0*x1);
    562     G4double dx = zPathLength*(0.5*dirx + rms*G4RandGauss::shoot(0.0,1.0));
    563     G4double dy = zPathLength*(0.5*diry + rms*G4RandGauss::shoot(0.0,1.0));
    564     G4double dz;
    565     G4double d = (dx*dx + dy*dy)/(zPathLength*zPathLength);
    566     if(d < numlimit)  dz = -0.5*zPathLength*d*(1.0 + 0.25*d);
    567     else if(d < 1.0)  dz = -zPathLength*(1.0 - sqrt(1.0 - d));
    568     else {
    569       dx = dy = dz = 0.0;
    570     }
    571 
    572     temp.set(dx,dy,dz);
    573     if(isscat) temp.rotateUz(dir);
    574     pos += temp;
    575    
    576     pos.rotateUz(oldDirection);
    577 
     478  fParticleChange->ProposeMomentumDirection(dir);
     479
     480  // lateral displacement 
     481  if (latDisplasment) {
    578482    G4double r = pos.mag();
    579483
     
    597501G4double G4WentzelVIModel::ComputeXSectionPerVolume()
    598502{
    599   const G4ElementVector* theElementVector =
    600     currentMaterial->GetElementVector();
     503  // prepare recomputation of x-sections
     504  const G4ElementVector* theElementVector = currentMaterial->GetElementVector();
    601505  const G4double* theAtomNumDensityVector =
    602506    currentMaterial->GetVecNbOfAtomsPerVolume();
     
    604508  if(nelm > nelments) {
    605509    nelments = nelm;
    606     xsecn.resize(nelments);
    607     prob.resize(nelments);
    608   }
    609 
     510    xsecn.resize(nelm);
     511    prob.resize(nelm);
     512  }
     513  G4double cut = (*currentCuts)[currentMaterialIndex];
     514  cosTetMaxNuc = wokvi->GetCosThetaNuc();
     515
     516  // check consistency
    610517  xtsec = 0.0;
     518  if(cosTetMaxNuc > cosThetaMin) { return 0.0; }
     519
     520  // loop over elements
    611521  G4double xs = 0.0;
    612 
    613   for (G4int i=0; i<nelm; i++) {
    614     SetupTarget((*theElementVector)[i]->GetZ(), tkin);
     522  for (G4int i=0; i<nelm; ++i) {
     523    G4double costm =
     524      wokvi->SetupTarget(G4int((*theElementVector)[i]->GetZ()), cut);
    615525    G4double density = theAtomNumDensityVector[i];
    616     G4double cosnm = cosTetMaxNuc2;
    617     G4double cosem = cosTetMaxElec2;
    618 
    619     // recompute the angular limit
    620     cosTetMaxNuc2  = std::max(cosnm,cosThetaMin);
    621     cosTetMaxElec2 = std::max(cosem,cosThetaMin);
    622     xtsec += ComputeTransportXSectionPerAtom()*density;
    623     // return limit back
    624     cosTetMaxElec2 = cosem;
    625     cosTetMaxNuc2  = cosnm;
    626526
    627527    G4double esec = 0.0;
    628     G4double nsec = 0.0;
    629     G4double x1 = 1.0 - cosThetaMin + screenZ;
    630     G4double f  = kinFactor*density;
    631 
    632     // scattering off electrons
    633     if(cosThetaMin > cosem) {
    634       esec = f*(cosThetaMin - cosem)/(x1*(1.0 - cosem + screenZ));
    635     }
    636 
    637     // scattering off nucleaus
    638     if(cosThetaMin > cosnm) {
    639 
    640       // Rutherford part
    641       G4double s  = screenZ*formfactA;
    642       G4double z1 = 1.0 - cosnm + screenZ;
    643       G4double s1 = 1.0 - s;
    644       G4double d  = s1/formfactA;
    645 
    646       // check numerical limit
    647       if(d < numlimit*x1) {
    648         G4double x2 = x1*x1;
    649         G4double z2 = z1*z1;
    650         nsec = (1.0/(x1*x2) - 1.0/(z1*z2) - d*1.5*(1.0/(x2*x2) - 1.0/(z2*z2)))/
    651           (3.0*formfactA*formfactA);
    652       } else {
    653         G4double x2 = x1 + d;
    654         G4double z2 = z1 + d;
    655         nsec = (1.0/x1 - 1.0/z1 + 1.0/x2 - 1.0/z2 - 2.0*log(z1*x2/(z2*x1))/d)/(s1*s1);
    656       }
    657       nsec *= f*targetZ;
    658     }
    659     nsec += esec;
    660     if(nsec > 0.0) esec /= nsec;
    661     xs += nsec;
    662     xsecn[i] = xs;
     528    if(costm < cosThetaMin) { 
     529
     530      // recompute the transport x-section
     531      xs += density*wokvi->ComputeTransportCrossSectionPerAtom(cosThetaMin);
     532
     533      // recompute the total x-section
     534      G4double nsec = wokvi->ComputeNuclearCrossSection(cosThetaMin, costm);
     535      esec = wokvi->ComputeElectronCrossSection(cosThetaMin, costm);
     536      nsec += esec;
     537      if(nsec > 0.0) { esec /= nsec; }
     538      xtsec += nsec*density;
     539    }
     540    xsecn[i] = xtsec;
    663541    prob[i]  = esec;
    664     //G4cout << i << "  xs= " << xs << " cosThetaMin= " << cosThetaMin
    665     //     << " costm= " << costm << G4endl;
     542    //G4cout << i << "  xs= " << xs << " xtsec= " << xtsec << " 1-cosThetaMin= " << 1-cosThetaMin
     543    //     << " 1-cosTetMaxNuc2= " <<1-cosTetMaxNuc2<< G4endl;
    666544  }
    667545 
    668546  //G4cout << "ComputeXS result:  xsec(1/mm)= " << xs
    669   //<< " txsec(1/mm)= " << xtsec <<G4endl;
     547  //     << " txsec(1/mm)= " << xtsec <<G4endl;
    670548  return xs;
    671549}
    672550
    673551//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    674 
    675 /*
    676 G4double G4MuMscModel::ComputeXSectionPerVolume()
    677 {
    678   const G4ElementVector* theElementVector =
    679     currentMaterial->GetElementVector();
    680   const G4double* theAtomNumDensityVector =
    681     currentMaterial->GetVecNbOfAtomsPerVolume();
    682   size_t nelm = currentMaterial->GetNumberOfElements();
    683 
    684   xsece1 = 0.0;
    685   xsece2 = 0.0;
    686   xsecn2 = 0.0;
    687   zcorr  = 0.0;
    688 
    689   G4double fac = coeff*chargeSquare*invbeta2/mom2;
    690 
    691   for (size_t i=0; i<nelm; i++) {
    692     const G4Element* elm = (*theElementVector)[i];
    693     G4double Z = elm->GetZ();
    694     SetupTarget(Z, tkin);
    695     G4double den = fac*theAtomNumDensityVector[i]*Z;
    696 
    697     G4double x  = 1.0 - cosThetaMin;
    698     G4double x1 = x + screenZ;
    699     G4double x2 = 1.0/(x1*x1);
    700     G4double x3 = 1.0 + x*formfactA;
    701    
    702     //G4cout << "x= " << x << " den= " << den << " cosE= " << cosTetMaxElec << G4endl;
    703     //G4cout << "cosThtaMin= " << cosThetaMin << G4endl;
    704     //G4cout << "cosTetMaxNuc= " << cosTetMaxNuc << " q2Limit= " << q2Limit << G4endl;
    705    
    706     // scattering off electrons
    707     if(cosTetMaxElec < cosThetaMin) {
    708 
    709       // flat part
    710       G4double s = den*x2*x;
    711       xsece1 += s;
    712       zcorr  += 0.5*x*s;
    713 
    714       // Rutherford part
    715       G4double z1 = 1.0 - cosTetMaxElec + screenZ;
    716       G4double z2 = (cosThetaMin - cosTetMaxElec)/x1;
    717       if(z2 < 0.2) s = z2*(x - 0.5*z2*(x - screenZ))/x1;
    718       else         s = log(1.0 + z2)  - screenZ*z2/z1;
    719       xsece2  += den*z2/z1;
    720       zcorr   += den*s;
    721     }
    722     den *= Z;
    723 
    724     //G4cout << "Z= " << Z<< " cosL= " << cosTetMaxNuc << " cosMin= " << cosThetaMin << G4endl;
    725     // scattering off nucleaus
    726     if(cosTetMaxNuc < cosThetaMin) {
    727 
    728       // flat part
    729       G4double s = den*x2*x/(x3*x3);
    730       xsece1 += s;
    731       zcorr  += 0.5*x*s;
    732 
    733       // Rutherford part
    734       s  = screenZ*formfactA;
    735       G4double w  = 1.0 + 2.0*s;
    736       G4double z1 = 1.0 - cosTetMaxNuc + screenZ;
    737       G4double d  = (1.0 - s)/formfactA;
    738       G4double x4 = x1 + d;
    739       G4double z4 = z1 + d;
    740       G4double t1 = 1.0/(x1*z1);
    741       G4double t4 = 1.0/(x4*z4);
    742       G4double w1 = cosThetaMin - cosTetMaxNuc;
    743       G4double w2 = log(z1*x4/(x1*z4));
    744 
    745       den *= w;     
    746       xsecn2  += den*(w1*(t1 + t4) - 2.0*w2/d);
    747       zcorr   += den*(w*w2 - w1*(screenZ*t1 + t4/formfactA));
    748     }
    749     xsece[i] = xsece2;
    750     xsecn[i] = xsecn2;
    751     //    G4cout << i << "  xsece2= " << xsece2 << "  xsecn2= " << xsecn2 << G4endl;
    752   }
    753   G4double xsec = xsece1 + xsece2 + xsecn2;
    754  
    755     //G4cout << "xsece1= " << xsece1 << "  xsece2= " << xsece2
    756     //<< "  xsecn2= " << xsecn2
    757         // << " zsec= " << zcorr*0.5*tPathLength << G4endl;
    758   zcorr *= 0.5*tPathLength;
    759 
    760   return xsec;
    761 }
    762 */
    763 
    764 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    765 
    766 void G4WentzelVIModel::ComputeMaxElectronScattering(G4double cutEnergy)
    767 {
    768   ecut = cutEnergy;
    769   G4double tmax = tkin;
    770   cosTetMaxElec = 1.0;
    771   if(mass > MeV) {
    772     G4double ratio = electron_mass_c2/mass;
    773     G4double tau = tkin/mass;
    774     tmax = 2.0*electron_mass_c2*tau*(tau + 2.)/
    775       (1.0 + 2.0*ratio*(tau + 1.0) + ratio*ratio);
    776     cosTetMaxElec = 1.0 - std::min(cutEnergy, tmax)*electron_mass_c2/mom2;
    777   } else {
    778 
    779     if(particle == theElectron) tmax *= 0.5;
    780     G4double t = std::min(cutEnergy, tmax);
    781     G4double mom21 = t*(t + 2.0*electron_mass_c2);
    782     G4double t1 = tkin - t;
    783     //G4cout <<"tkin=" <<tkin<<" tmax= "<<tmax<<" t= "
    784     //<<t<< " t1= "<<t1<<" cut= "<<ecut<<G4endl;
    785     if(t1 > 0.0) {
    786       G4double mom22 = t1*(t1 + 2.0*mass);
    787       G4double ctm = (mom2 + mom22 - mom21)*0.5/sqrt(mom2*mom22);
    788       if(ctm <  1.0) cosTetMaxElec = ctm;
    789       if(ctm < -1.0) cosTetMaxElec = -1.0;
    790     }
    791   }
    792   if(cosTetMaxElec < cosTetMaxNuc) cosTetMaxElec = cosTetMaxNuc;
    793 }
    794 
    795 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
  • trunk/source/processes/electromagnetic/standard/src/G4eBremsstrahlungModel.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4eBremsstrahlungModel.cc,v 1.44 2009/04/09 18:41:18 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4eBremsstrahlungModel.cc,v 1.46 2010/04/28 18:39:40 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    9292  if(p) SetParticle(p);
    9393  theGamma = G4Gamma::Gamma();
    94   minThreshold = 1.0*keV;
     94  minThreshold = 0.1*keV;
    9595}
    9696
     
    901901  if(1 < nElements) {
    902902
     903    --nElements;
    903904    G4DataVector* dv = partialSumSigma[couple->GetIndex()];
    904     G4double rval = G4UniformRand()*((*dv)[nElements-1]);
    905 
    906     for (G4int i=0; i<nElements; i++) {
    907       if (rval <= (*dv)[i]) elm = (*theElementVector)[i];
    908     }
    909     if(!elm) {
    910       G4cout << "G4eBremsstrahlungModel::SelectRandomAtom: Warning -"
    911              << " no elements found in "
    912              << material->GetName()
    913              << G4endl;
    914       elm = (*theElementVector)[0];
    915     }
    916   } else elm = (*theElementVector)[0];
     905    G4double rval = G4UniformRand()*((*dv)[nElements]);
     906
     907    elm = (*theElementVector)[nElements];
     908    for (G4int i=0; i<nElements; ++i) {
     909      if (rval <= (*dv)[i]) {
     910        elm = (*theElementVector)[i];
     911        break;
     912      }
     913    }
     914  } else { elm = (*theElementVector)[0]; }
    917915 
    918916  SetCurrentElement(elm);
  • trunk/source/processes/electromagnetic/standard/src/G4eBremsstrahlungRelModel.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4eBremsstrahlungRelModel.cc,v 1.14 2009/04/09 18:41:18 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4eBremsstrahlungRelModel.cc,v 1.15 2010/04/06 17:02:23 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    9393  theGamma = G4Gamma::Gamma();
    9494
    95   minThreshold = 1.0*keV;
     95  minThreshold = 0.1*keV;
    9696  SetLowEnergyLimit(GeV); 
    9797
  • trunk/source/processes/electromagnetic/standard/src/G4eCoulombScatteringModel.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4eCoulombScatteringModel.cc,v 1.78 2009/10/28 10:14:13 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4eCoulombScatteringModel.cc,v 1.89 2010/05/27 14:22:05 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    4747// 09.06.08 V.Ivanchenko add SelectIsotope and sampling of the recoil ion
    4848// 16.06.09 C.Consolandi fixed computation of effective mass
     49// 27.05.10 V.Ivanchenko added G4WentzelOKandVIxSection class to
     50//              compute cross sections and sample scattering angle
    4951//
    5052//
     
    6062#include "G4DataVector.hh"
    6163#include "G4ElementTable.hh"
    62 #include "G4PhysicsLogVector.hh"
    6364#include "G4ParticleChangeForGamma.hh"
    64 #include "G4Electron.hh"
    65 #include "G4Positron.hh"
    6665#include "G4Proton.hh"
    6766#include "G4ParticleTable.hh"
    6867#include "G4ProductionCutsTable.hh"
    6968#include "G4NucleiProperties.hh"
    70 
    71 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    72 
    73 G4double G4eCoulombScatteringModel::ScreenRSquare[] = {0.0};
    74 G4double G4eCoulombScatteringModel::FormFactor[]    = {0.0};
     69#include "G4Pow.hh"
     70#include "G4LossTableManager.hh"
     71#include "G4NistManager.hh"
     72
     73//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
    7574
    7675using namespace std;
     
    8079    cosThetaMin(1.0),
    8180    cosThetaMax(-1.0),
    82     q2Limit(TeV*TeV),
    83     alpha2(fine_structure_const*fine_structure_const),
    84     faclim(100.0),
    8581    isInitialised(false)
    8682{
    8783  fNistManager = G4NistManager::Instance();
    8884  theParticleTable = G4ParticleTable::GetParticleTable();
    89   theElectron = G4Electron::Electron();
    90   thePositron = G4Positron::Positron();
    9185  theProton   = G4Proton::Proton();
    9286  currentMaterial = 0;
    9387  currentElement  = 0;
    94   lowEnergyLimit  = 0.1*keV;
    95   G4double p0 = electron_mass_c2*classic_electr_radius;
    96   coeff  = twopi*p0*p0;
    97   tkin = targetZ = mom2 = DBL_MIN;
    98   elecXSection = nucXSection = 0.0;
     88  lowEnergyLimit  = 1*eV;
    9989  recoilThreshold = 0.*keV;
    100   ecut = DBL_MAX;
    10190  particle = 0;
    10291  currentCouple = 0;
    103 
    104   // Thomas-Fermi screening radii
    105   // Formfactors from A.V. Butkevich et al., NIM A 488 (2002) 282
    106 
    107   if(0.0 == ScreenRSquare[0]) {
    108     G4double a0 = electron_mass_c2/0.88534;
    109     G4double constn = 6.937e-6/(MeV*MeV);
    110 
    111     ScreenRSquare[0] = alpha2*a0*a0;
    112     for(G4int j=1; j<100; j++) {
    113       G4double x = a0*fNistManager->GetZ13(j);
    114       ScreenRSquare[j] = alpha2*x*x;
    115       x = fNistManager->GetA27(j);
    116       FormFactor[j] = constn*x*x;
    117     }
    118   }
     92  wokvi = new G4WentzelOKandVIxSection();
    11993}
    12094
     
    12296
    12397G4eCoulombScatteringModel::~G4eCoulombScatteringModel()
    124 {}
     98{
     99  delete wokvi;
     100}
    125101
    126102//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     
    131107  SetupParticle(p);
    132108  currentCouple = 0;
    133   elecXSection = nucXSection = 0.0;
    134   tkin = targetZ = mom2 = DBL_MIN;
    135   ecut = etag = DBL_MAX;
    136109  cosThetaMin = cos(PolarAngleLimit());
     110  wokvi->Initialise(p, cosThetaMin);
     111  /*
     112  G4cout << "G4eCoulombScatteringModel: factorA2(GeV^2) = " << factorA2/(GeV*GeV)
     113         << "  1-cos(ThetaLimit)= " << 1 - cosThetaMin
     114         << "  cos(thetaMax)= " <<  cosThetaMax
     115         << G4endl;
     116  */
    137117  pCuts = G4ProductionCutsTable::GetProductionCutsTable()->GetEnergyCutsVector(3);
    138118  //G4cout << "!!! G4eCoulombScatteringModel::Initialise for "
     
    151131//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    152132
    153 void G4eCoulombScatteringModel::ComputeMaxElectronScattering(G4double cutEnergy)
    154 {
    155   ecut = cutEnergy;
    156   G4double tmax = tkin;
    157   cosTetMaxElec = 1.0;
    158   if(mass > MeV) {
    159     G4double ratio = electron_mass_c2/mass;
    160     G4double tau = tkin/mass;
    161     tmax = 2.0*electron_mass_c2*tau*(tau + 2.)/
    162       (1.0 + 2.0*ratio*(tau + 1.0) + ratio*ratio);
    163     cosTetMaxElec = 1.0 - std::min(cutEnergy, tmax)*electron_mass_c2/mom2;
    164   } else {
    165 
    166     if(particle == theElectron) tmax *= 0.5;
    167     G4double t = std::min(cutEnergy, tmax);
    168     G4double mom21 = t*(t + 2.0*electron_mass_c2);
    169     G4double t1 = tkin - t;
    170     //G4cout << "tkin= " << tkin << " t= " << t << " t1= " << t1 << G4endl;
    171     if(t1 > 0.0) {
    172       G4double mom22 = t1*(t1 + 2.0*mass);
    173       G4double ctm = (mom2 + mom22 - mom21)*0.5/sqrt(mom2*mom22);
    174       //G4cout << "ctm= " << ctm << G4endl;
    175       if(ctm <  1.0) cosTetMaxElec = ctm;
    176       if(ctm < -1.0) cosTetMaxElec = -1.0;
    177     }
    178   }
    179 }
    180 
    181 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    182 
    183133G4double G4eCoulombScatteringModel::ComputeCrossSectionPerAtom(
    184134                const G4ParticleDefinition* p,
     
    190140  //  << p->GetParticleName()<<" Z= "<<Z<<" e(MeV)= "<< kinEnergy/MeV << G4endl;
    191141  G4double xsec = 0.0;
    192   SetupParticle(p);
    193   if(kinEnergy < lowEnergyLimit) return xsec;
    194   SetupKinematic(kinEnergy, cutEnergy);
    195   if(cosTetMaxNuc < cosTetMinNuc) {
    196     SetupTarget(Z, kinEnergy);
    197     xsec = CrossSectionPerAtom(); 
     142  if(p != particle) { SetupParticle(p); }
     143
     144  // cross section is set to zero to avoid problems in sample secondary
     145  if(kinEnergy < lowEnergyLimit) { return xsec; }
     146  DefineMaterial(CurrentCouple());
     147  cosTetMinNuc = wokvi->SetupKinematic(kinEnergy, currentMaterial);
     148  if(cosThetaMax < cosTetMinNuc) {
     149    G4int iz = G4int(Z);
     150    cosTetMinNuc = wokvi->SetupTarget(iz, cutEnergy);
     151    cosTetMaxNuc = cosThetaMax;
     152    if(iz == 1 && cosTetMaxNuc < 0.0 && particle == theProton) {
     153      cosTetMaxNuc = 0.0;
     154    }
     155    xsec =  wokvi->ComputeNuclearCrossSection(cosTetMinNuc, cosTetMaxNuc);
     156    elecRatio = wokvi->ComputeElectronCrossSection(cosTetMinNuc, cosThetaMax);
     157    xsec += elecRatio;
     158    if(xsec > 0.0) { elecRatio /= xsec; } 
    198159  }
    199160  /*
    200   G4cout << "e(MeV)= " << ekin/MeV << "cosTetMinNuc= " << cosTetMinNuc
    201          << " cosTetMaxNuc= " << cosTetMaxNuc
    202          << " cosTetMaxElec= " << cosTetMaxElec
     161  G4cout << "e(MeV)= " << kinEnergy/MeV << " xsec(b)= " << xsec/barn 
     162         << " 1-cosTetMinNuc= " << 1-cosTetMinNuc
     163         << " 1-cosTetMaxNuc2= " << 1-cosTetMaxNuc2
     164         << " 1-cosTetMaxElec= " << 1-cosTetMaxElec
    203165         << " screenZ= " << screenZ
    204166         << " formfactA= " << formfactA << G4endl;
    205167  */
    206168  return xsec; 
    207 }
    208 
    209 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    210 
    211 G4double G4eCoulombScatteringModel::CrossSectionPerAtom()
    212 {
    213   // This method needs initialisation before be called
    214   //G4double fac = coeff*targetZ*chargeSquare*invbeta2/mom2;
    215 
    216   G4double meff = targetMass/(mass+targetMass);
    217   G4double fac  = coeff*targetZ*chargeSquare*invbeta2/(mom2*meff*meff);
    218 
    219   elecXSection = 0.0;
    220   nucXSection  = 0.0;
    221 
    222   G4double x  = 1.0 - cosTetMinNuc;
    223   G4double x1 = x + screenZ;
    224 
    225   if(cosTetMaxElec2 < cosTetMinNuc) {
    226     elecXSection = fac*(cosTetMinNuc - cosTetMaxElec2)/
    227       (x1*(1.0 - cosTetMaxElec2 + screenZ));
    228     nucXSection  = elecXSection;
    229   }
    230 
    231   //G4cout << "XS tkin(MeV)= " << tkin<<" xs= " <<nucXSection
    232   //     << " costmax= " << cosTetMaxNuc2
    233   //     << " costmin= " << cosTetMinNuc << "  Z= " << targetZ <<G4endl;
    234   if(cosTetMaxNuc2 < cosTetMinNuc) {
    235     G4double s  = screenZ*formfactA;
    236     G4double z1 = 1.0 - cosTetMaxNuc2 + screenZ;
    237     G4double s1 = 1.0 - s;
    238     G4double d  = s1/formfactA;
    239     //G4cout <<"x1= "<<x1<<" z1= " <<z1<<" s= "<<s << " d= " <<d <<G4endl;
    240     if(d < 0.2*x1) {
    241       G4double x2 = x1*x1;
    242       G4double z2 = z1*z1;
    243       x = (1.0/(x1*x2) - 1.0/(z1*z2) - d*1.5*(1.0/(x2*x2) - 1.0/(z2*z2)))/
    244         (3.0*formfactA*formfactA);
    245     } else {
    246       G4double x2 = x1 + d;
    247       G4double z2 = z1 + d;
    248       x = (1.0/x1 - 1.0/z1 + 1.0/x2 - 1.0/z2 - 2.0*log(z1*x2/(z2*x1))/d)/(s1*s1);
    249     }
    250     nucXSection += fac*targetZ*x;
    251   }
    252   //G4cout<<" cross(bn)= "<<nucXSection/barn<<" xsElec(bn)= "<<elecXSection/barn
    253   //    << " Asc= " << screenZ << G4endl;
    254  
    255   return nucXSection;
    256169}
    257170
     
    266179{
    267180  G4double kinEnergy = dp->GetKineticEnergy();
    268   if(kinEnergy < lowEnergyLimit) return;
    269   DefineMaterial(couple);
     181  if(kinEnergy < lowEnergyLimit) { return; }
    270182  SetupParticle(dp->GetDefinition());
    271183
    272   SetupKinematic(kinEnergy, cutEnergy);
    273184  //G4cout << "G4eCoulombScatteringModel::SampleSecondaries e(MeV)= "
    274185  //     << kinEnergy << "  " << particle->GetParticleName()
     
    279190                                    kinEnergy,cutEnergy,kinEnergy);
    280191
    281   SetupTarget(currentElement->GetZ(),kinEnergy);
    282 
     192  G4double Z = currentElement->GetZ();
     193 
     194  if(ComputeCrossSectionPerAtom(particle,kinEnergy, Z,
     195                                kinEnergy, cutEnergy, kinEnergy) == 0.0)
     196    { return; }
     197
     198  G4int iz = G4int(Z);
    283199  G4int ia = SelectIsotopeNumber(currentElement);
    284   targetMass = G4NucleiProperties::GetNuclearMass(ia, iz);
    285  
    286   G4double cost = SampleCosineTheta();
    287   G4double z1   = 1.0 - cost;
    288   if(z1 < 0.0) return;
    289 
    290   G4double sint = sqrt(z1*(1.0 + cost));
    291  
    292   //G4cout<<"## Sampled sint= " << sint << "  Z= " << targetZ << " A= " << ia
    293   //    << "  screenZ= " << screenZ << " cn= " << formfactA << G4endl;
    294  
    295   G4double phi  = twopi * G4UniformRand();
     200  G4double targetMass = G4NucleiProperties::GetNuclearMass(ia, iz);
     201
     202  G4ThreeVector newDirection =
     203    wokvi->SampleSingleScattering(cosTetMinNuc, cosThetaMax, elecRatio);
     204  G4double cost = newDirection.z();
    296205
    297206  G4ThreeVector direction = dp->GetMomentumDirection();
    298   G4ThreeVector newDirection(cos(phi)*sint,sin(phi)*sint,cost);
    299207  newDirection.rotateUz(direction);   
    300208
     
    303211  // recoil sampling assuming a small recoil
    304212  // and first order correction to primary 4-momentum
    305   G4double q2   = 2*z1*mom2;
    306   G4double trec = q2/(sqrt(targetMass*targetMass + q2) + targetMass);
     213  G4double mom2 = wokvi->GetMomentumSquare();
     214  G4double trec = mom2*(1.0 - cost)/(targetMass + (mass + kinEnergy)*(1.0 + cost));
    307215  G4double finalT = kinEnergy - trec;
    308216  //G4cout<<"G4eCoulombScatteringModel: finalT= "<<finalT<<" Trec= "<<trec<<G4endl;
     
    332240//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    333241
    334 G4double G4eCoulombScatteringModel::SampleCosineTheta()
    335 {
    336   G4double costm = cosTetMaxNuc2;
    337   G4double formf = formfactA;
    338   G4double prob  = 0.0;
    339   G4double xs = CrossSectionPerAtom();
    340   if(xs > 0.0) prob = elecXSection/xs;
    341 
    342   // scattering off e or A?
    343   if(G4UniformRand() < prob) {
    344     costm = cosTetMaxElec2;
    345     formf = 0.0;
    346   }
    347 
    348   /* 
    349   G4cout << "SampleCost: e(MeV)= " << tkin
    350          << " 1-ctmaxN= " << 1. - cosTetMinNuc
    351          << " 1-ctmax= " << 1. - costm
    352          << " Z= " << targetZ
    353          << G4endl;
    354   */
    355 
    356   if(costm >= cosTetMinNuc) return 2.0;
    357 
    358   G4double x1 = 1. - cosTetMinNuc + screenZ;
    359   G4double x2 = 1. - costm + screenZ;
    360   G4double x3 = cosTetMinNuc - costm;
    361   G4double grej, z1;
    362   do {
    363     z1 = x1*x2/(x1 + G4UniformRand()*x3) - screenZ;
    364     grej = 1.0/(1.0 + formf*z1);
    365   } while ( G4UniformRand() > grej*grej ); 
    366 
    367   if(mass > MeV) {
    368     if(G4UniformRand() > (1. - z1*0.5)/(1.0 + z1*sqrt(mom2)/targetMass)) {
    369       return 2.0;
    370     }
    371   }
    372   //G4cout << "z1= " << z1 << " cross= " << nucXSection/barn
    373   //     << " crossE= " << elecXSection/barn << G4endl;
    374 
    375   return 1.0 - z1;
    376 }
    377 
    378 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
    379 
    380 
     242
  • trunk/source/processes/electromagnetic/standard/src/G4eMultipleScattering.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4eMultipleScattering.cc,v 1.10 2009/11/01 13:05:01 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4eMultipleScattering.cc,v 1.12 2010/06/04 09:11:02 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -----------------------------------------------------------------------------
     
    4545
    4646#include "G4eMultipleScattering.hh"
    47 #include "G4UrbanMscModel92.hh"
     47#include "G4UrbanMscModel93.hh"
    4848#include "G4MscStepLimitType.hh"
    4949#include "G4Electron.hh"
     
    7777void G4eMultipleScattering::InitialiseProcess(const G4ParticleDefinition*)
    7878{
    79   if(isInitialized) return;
     79  if(isInitialized) { return; }
    8080
    8181  // initialisation of parameters - defaults for particles other
    8282  // than ions can be overwritten by users
    83   G4VMscModel* mscUrban = new G4UrbanMscModel92();
     83  G4VMscModel* mscUrban = new G4UrbanMscModel93();
    8484  AddEmModel(1,mscUrban);
    8585  isInitialized = true;
    86   /*
    87   G4cout << "G4eMultipleScattering::InitialiseProcess for "
    88          << p->GetParticleName()
    89          << " skin= " << Skin()
    90          << " SA= " << steppingAlgorithm
    91          << G4endl;
    92   */
    9386}
    9487
     
    9891{
    9992  G4cout << "      RangeFactor= " << RangeFactor()
    100          << ", step limit type: " << StepLimitType()
    101          << ", lateralDisplacement: " << LateralDisplasmentFlag()
    102          << ", skin= " << Skin() 
    103          << ", geomFactor= " << GeomFactor() 
    104          << G4endl;
     93         << ", stepLimitType: " << StepLimitType()
     94         << ", latDisplacement: " << LateralDisplasmentFlag();
     95  if(StepLimitType() == fUseDistanceToBoundary) {
     96    G4cout  << ", skin= " << Skin() << ", geomFactor= " << GeomFactor();
     97  } 
     98  G4cout << G4endl;
    10599}
    106100
  • trunk/source/processes/electromagnetic/standard/src/G4hIonisation.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4hIonisation.cc,v 1.82 2009/02/20 12:06:37 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4hIonisation.cc,v 1.85 2010/06/04 09:22:14 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -------------------------------------------------------------------
     
    7979// 14-01-07 use SetEmModel() and SetFluctModel() from G4VEnergyLossProcess (mma)
    8080// 12-09-08 Removed CorrectionsAlongStep (VI)
     81// 27-05-10 Added G4ICRU73QOModel for anti-protons (VI)
    8182//
    8283// -------------------------------------------------------------------
     
    99100#include "G4KaonPlus.hh"
    100101#include "G4KaonMinus.hh"
     102#include "G4ICRU73QOModel.hh"
    101103
    102104//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     
    106108G4hIonisation::G4hIonisation(const G4String& name)
    107109  : G4VEnergyLossProcess(name),
    108     isInitialised(false),
    109     nuclearStopping(true)
    110 {
    111   //  SetStepFunction(0.2, 1.0*mm);
     110    isInitialised(false)
     111{
     112  //SetStepFunction(0.2, 1.0*mm);
    112113  //SetIntegral(true);
    113114  //SetVerboseLevel(1);
     
    151152    const G4ParticleDefinition* theBaseParticle = 0;
    152153    G4String pname = part->GetParticleName();
     154    G4double q = part->GetPDGCharge();
    153155
    154156    // standard base particles
     
    163165    else if(bpart == 0) {
    164166
    165       if(part->GetPDGSpin() == 0.0)
    166         if(part->GetPDGCharge() > 0.0 ) {
    167           theBaseParticle = G4KaonPlus::KaonPlus();
    168         } else {
    169           theBaseParticle = G4KaonMinus::KaonMinus();
    170         }
    171       else if(part->GetPDGCharge() > 0.0) {
    172         theBaseParticle = G4Proton::Proton();
     167      if(part->GetPDGSpin() == 0.0) {
     168        if(q > 0.0) { theBaseParticle = G4KaonPlus::KaonPlus(); }
     169        else { theBaseParticle = G4KaonMinus::KaonMinus(); }
    173170      } else {
    174         theBaseParticle = G4AntiProton::AntiProton();
     171        if(q > 0.0) { theBaseParticle = G4Proton::Proton(); }
     172        else { theBaseParticle = G4AntiProton::AntiProton(); }
    175173      }
     174
    176175      // base particle defined by interface
    177176    } else {
     
    183182    mass  = part->GetPDGMass();
    184183    ratio = electron_mass_c2/mass;
    185 
    186     if(mass < 900.*MeV) nuclearStopping = false;
    187 
    188     if (!EmModel(1)) SetEmModel(new G4BraggModel(),1);
     184    eth   = 2.0*MeV*mass/proton_mass_c2;
     185
     186    if (!EmModel(1)) {
     187      if(q > 0.0) { SetEmModel(new G4BraggModel(),1); }
     188      else { SetEmModel(new G4ICRU73QOModel(),1); }
     189    }
    189190    EmModel(1)->SetLowEnergyLimit(MinKinEnergy());
    190191
    191192    // model limit defined for protons
    192     eth = (EmModel(1)->HighEnergyLimit())*mass/proton_mass_c2;
     193    //eth = (EmModel(1)->HighEnergyLimit())*mass/proton_mass_c2;
    193194    EmModel(1)->SetHighEnergyLimit(eth);
    194195    AddEmModel(1, EmModel(1), new G4IonFluctuations());
    195196
    196     if (!FluctModel()) SetFluctModel(new G4UniversalFluctuation());
    197 
    198     if (!EmModel(2)) SetEmModel(new G4BetheBlochModel(),2); 
     197    if (!FluctModel()) { SetFluctModel(new G4UniversalFluctuation()); }
     198
     199    if (!EmModel(2)) { SetEmModel(new G4BetheBlochModel(),2); }
    199200    EmModel(2)->SetLowEnergyLimit(eth);
    200201    EmModel(2)->SetHighEnergyLimit(MaxKinEnergy());
     
    203204    isInitialised = true;
    204205  }
    205   EmModel(1)->ActivateNuclearStopping(nuclearStopping);
    206   EmModel(2)->ActivateNuclearStopping(nuclearStopping);
    207206}
    208207
     
    210209
    211210void G4hIonisation::PrintInfo()
    212 {
    213   if(EmModel(1) && EmModel(2)) {
    214     G4cout << "      NuclearStopping= " << nuclearStopping
    215            << G4endl;
    216   }
    217 }
    218 
    219 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     211{}
     212
     213//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
     214
     215void G4hIonisation::ActivateNuclearStopping(G4bool)
     216{}
     217
     218//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
  • trunk/source/processes/electromagnetic/standard/src/G4hMultipleScattering.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    26 // $Id: G4hMultipleScattering.cc,v 1.16 2009/11/01 13:05:01 vnivanch Exp $
    27 // GEANT4 tag $Name: geant4-09-03 $
     26// $Id: G4hMultipleScattering.cc,v 1.18 2010/04/16 09:01:24 vnivanch Exp $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// -----------------------------------------------------------------------------
     
    4747
    4848#include "G4hMultipleScattering.hh"
    49 #include "G4UrbanMscModel.hh"
    5049#include "G4UrbanMscModel90.hh"
    5150#include "G4MscStepLimitType.hh"
     
    9089  G4cout << "      RangeFactor= " << RangeFactor()
    9190         << ", stepLimitType: " << StepLimitType()
    92          << ", latDisplacement: " << LateralDisplasmentFlag()
    93          << ", skin= " << Skin()
    94          << ", geomFactor= " << GeomFactor() 
    95          << G4endl;
     91         << ", latDisplacement: " << LateralDisplasmentFlag();
     92  if(StepLimitType() == fUseDistanceToBoundary) {
     93    G4cout  << ", skin= " << Skin() << ", geomFactor= " << GeomFactor();
     94  } 
     95  G4cout << G4endl;
    9696}
    9797
  • trunk/source/processes/electromagnetic/standard/test/BremLPMTest.cc

    r1199 r1315  
    2525//
    2626// $Id: BremLPMTest.cc,v 1.2 2008/08/22 08:16:17 schaelic Exp $
    27 // GEANT4 tag $Name: geant4-09-03-cand-01 $
     27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2828//
    2929// ------------------------------------------------------------
  • trunk/source/processes/electromagnetic/standard/test/CrossSectionStd.cc

    r1199 r1315  
    2626//
    2727// $Id: CrossSectionStd.cc,v 1.5 2006/06/29 19:54:07 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-03-cand-01 $
     28// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2929//
    3030// ------------------------------------------------------------
  • trunk/source/processes/electromagnetic/standard/test/CrossSectionV52.cc

    r1199 r1315  
    2626//
    2727// $Id: CrossSectionV52.cc,v 1.4 2006/06/29 19:54:09 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-03-cand-01 $
     28// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2929//
    3030// ------------------------------------------------------------
  • trunk/source/processes/electromagnetic/standard/test/G4InitXscPAItest.cc

    r1199 r1315  
    2626//
    2727// $Id: G4InitXscPAItest.cc,v 1.6 2006/06/29 19:54:11 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-03-cand-01 $
     28// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2929//
    3030//
  • trunk/source/processes/electromagnetic/standard/test/G4PAIdNdxTest.cc

    r1199 r1315  
    2626//
    2727// $Id: G4PAIdNdxTest.cc,v 1.8 2008/04/14 14:53:39 grichine Exp $
    28 // GEANT4 tag $Name: geant4-09-03-cand-01 $
     28// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2929//
    3030//
  • trunk/source/processes/electromagnetic/standard/test/G4PAIxSectionTest.cc

    r1199 r1315  
    2525//
    2626//
    27 // $Id: G4PAIxSectionTest.cc,v 1.15 2006/06/29 19:54:15 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-03-cand-01 $
     27// $Id: G4PAIxSectionTest.cc,v 1.16 2009/12/30 12:57:41 grichine Exp $
     28// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2929//
    3030//
     
    432432 outFile <<k<<"\t"<< "  Material : " <<(*theMaterialTable)[k]->GetName() << G4endl ;
    433433  }
    434   G4String testName ;
     434  G4String testName = "Argon" ;
    435435  G4cout<<"Enter material name for test : "<<std::flush ;
    436436  //  G4cin>>testName ;
     
    448448
    449449
    450   for(k=0;k<numOfMaterials;k++)
     450  for( k = 0; k < numOfMaterials; k++ )
    451451  {
    452     //    if((*theMaterialTable)[k]->GetName() != testName) continue ;
     452    if((*theMaterialTable)[k]->GetName() != testName) continue ;
    453453     outFile << "Material : " <<(*theMaterialTable)[k]->GetName() << G4endl ;
    454454     G4cout << "Material : " <<(*theMaterialTable)[k]->GetName() << G4endl ;
     
    543543     //   G4PAIxSection testPAIproton(k,maxEnergyTransfer) ;
    544544
    545      kineticEnergy = 10.0*keV ;  // 110*MeV ;
     545     kineticEnergy = 100.*MeV;  // 10.0*keV ;  // 110*MeV ;
    546546
    547547     //     for(j=1;j<testPAIproton.GetNumberOfGammas();j++)
  • trunk/source/processes/electromagnetic/standard/test/PAIenergyLossTest.cc

    r1199 r1315  
    2626//
    2727// $Id: PAIenergyLossTest.cc,v 1.8 2006/06/29 19:54:17 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-03-cand-01 $
     28// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2929//
    3030//
  • trunk/source/processes/electromagnetic/standard/test/readBremLPM.py

    r1199 r1315  
    11# $Id: readBremLPM.py,v 1.2 2008/08/22 08:16:17 schaelic Exp $
    2 # GEANT4 tag $Name: geant4-09-03-cand-01 $
     2# GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    33#
    44# works together with BremLPMTest.cc
  • trunk/source/processes/electromagnetic/standard/test/test90Ne10CO2pai.cc

    r1199 r1315  
    2525//
    2626//
    27 // $Id: test90Ne10CO2pai.cc,v 1.6 2008/12/18 13:01:40 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-03-cand-01 $
     27// $Id: test90Ne10CO2pai.cc,v 1.8 2009/12/30 12:57:41 grichine Exp $
     28// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
    2929//
    3030//
     
    3838// 11.04.08, V. Grichine test of PAI predictions for 90% Ne + 10% CO2
    3939//                       ALICE TPC gas mixture
     40// 8.12.09   V. Grichine update for T2K gas mixture
    4041
    4142#include "G4ios.hh"
     
    150151int main()
    151152{
    152    std::ofstream outFile("90Ne10CO2pai.dat", std::ios::out );
     153  // std::ofstream outFile("90Ne10CO2pai.dat", std::ios::out );
     154   std::ofstream outFile("e5GeVt2kPhilippe.dat", std::ios::out );
    153155   outFile.setf( std::ios::scientific, std::ios::floatfield );
    154156
     
    174176
    175177
     178  a = 1.01*g/mole;
     179  G4Isotope* ih1 = new G4Isotope("Hydrogen",iz=1,n=1,a);
     180
     181  a = 2.01*g/mole;
     182  G4Isotope* ih2 = new G4Isotope("Deuterium",iz=1,n=2,a);
     183
     184  G4Element* elH = new G4Element(name="Hydrogen",symbol="H",2);
     185  elH->AddIsotope(ih1,.999);
     186  elH->AddIsotope(ih2,.001);
     187
    176188  a = 12.01*g/mole;
    177189  G4Element* elC = new G4Element(name="Carbon",symbol="C", ez=6., a);
     
    183195  G4Element* elO = new G4Element(name="Oxygen",symbol="O", ez=8., a);
    184196
     197 
     198  a = 19.00*g/mole;
     199  G4Element* elF  = new G4Element(name="Fluorine", symbol="F", z=9., a);
    185200 
     201  a = 39.948*g/mole;
     202  G4Element* elAr = new G4Element(name="Argon", symbol="Ar", z=18., a);
    186203
    187204  // Neon as detector gas, STP
     
    232249  density *= 0.966/1.01325;
    233250
    234   G4cout<<"density of Ne857CO295N2T292 = "<<density*cm3/mg<<"  mg/cm3"<<G4endl;
     251  // G4cout<<"density of Ne857CO295N2T292 = "<<density*cm3/mg<<"  mg/cm3"<<G4endl;
    235252
    236253  G4Material* Ne857CO295N2T292 = new G4Material(name="Ne857CO295N2T292"  , density,
     
    241258
    242259
     260 
     261  // Ar as detector gas,STP
     262
     263  density = 1.7836*mg/cm3 ;       // STP
     264  G4Material* Argon = new G4Material(name="Argon"  , density, ncomponents=1);
     265  Argon->AddElement(elAr, 1);
     266  /*
     267  // iso-Butane (methylpropane), STP
     268
     269  density = 2.67*mg/cm3 ;
     270  G4Material* isobutane = new G4Material(name="isoC4H10",density,nel=2) ;
     271  isobutane->AddElement(elC,4) ;
     272  isobutane->AddElement(elH,10) ;
     273
     274  // CF4 from ATLAS TRT estimation
     275
     276  G4double TRT_CF4_density = 3.9*mg/cm3;
     277  G4Material* TRT_CF4 = new G4Material(name="TRT_CF4", TRT_CF4_density, nel=2,
     278                                           kStateGas,293.15*kelvin,1.*atmosphere);
     279  */
     280
     281  // Philippe Gros T2K mixture version
     282  // Argon                                                                                                   
     283  /*                                         
     284  density     = 1.66*mg/cm3;
     285  pressure    = 1*atmosphere;
     286  temperature = 288.15*kelvin;
     287  G4Material* Argon = new G4Material(name="Ar", // z=18., a=39.948*g/mole,
     288                                     density, ncomponents=1); // kStateGas,temperature,pressure);
     289  Argon->AddElement(elAr, 1);
     290  */
     291   
     292  // IsoButane   
     293                                                                                                   
     294  density     = 2.51*mg/cm3;
     295  G4Material* Isobu = new G4Material(name="isoC4H10", z=34.,a=58.123*g/mole,
     296                                       density, kStateGas,temperature,pressure);
     297
     298  // Tetrafluoromethane   
     299                                                                                           
     300  density = 3.72*mg/cm3;
     301  G4Material* FlMet = new
     302  G4Material(name="CF4",z=42.,a=88.01*g/mole,density,kStateGas,temperature,pressure);
     303
     304  // Argon + 3% tetrafluoromethane  + 2% iso-butane     
     305                                                           
     306  density = 1.748*mg/cm3;
     307  G4Material* t2kGasMixture = new G4Material(name="t2kGasMixture", density, ncomponents=3);
     308  t2kGasMixture->AddMaterial(Argon, fractionmass = 90.9*perCent);
     309  t2kGasMixture->AddMaterial(FlMet, fractionmass = 6.3*perCent);
     310  t2kGasMixture->AddMaterial(Isobu, fractionmass = 2.8*perCent);
     311
     312
    243313  G4int i, j, jMax, k, numOfMaterials, iSan, nbOfElements, sanIndex, row;
    244314  G4double maxEnergyTransfer, kineticEnergy;
     
    261331
    262332  // G4String testName = "N2";
    263   G4String testName = "Ne10CO2";
     333  // G4String testName = "Ne10CO2";
     334  G4String testName = "t2kGasMixture";
     335  // G4String testName = "Ar";
     336  //  G4String testName = "Argon";
    264337  // G4String testName = "Ne10CO2T293";
    265338  // G4String testName = "Ne857CO295N2T292";
     
    372445
    373446
    374      kineticEnergy = 10.0*keV; // 100.*GeV;    // 10.0*keV;  // 110*MeV; // for proton
     447     // kineticEnergy = 10.0*keV; // 100.*GeV;    // 10.0*keV;  // 110*MeV; // for proton
     448
     449     // kineticEnergy = 5*GeV; // for electrons
     450
     451     kineticEnergy = 5*GeV*proton_mass_c2/electron_mass_c2;
     452
     453     // kineticEnergy = 5*GeV;
    375454
    376455     //     for(j=1;j<testPAIproton.GetNumberOfGammas();j++)
    377456
    378      jMax = 70; // 70;
    379 
    380      outFile<<jMax<<G4endl;
     457     // jMax = 70; // 70;
     458     jMax = 1; // 70;
     459
     460     // outFile<<jMax<<G4endl;
    381461
    382462     for( j = 0; j < jMax; j++ )
    383463     {
    384464       tau      = kineticEnergy/proton_mass_c2;
     465       // tau      = kineticEnergy/electron_mass_c2;
    385466       gamma    = tau +1.0;
    386467       bg2      = tau*(tau + 2.0);
    387468       bg = std::sqrt(bg2);
    388469       beta2    = bg2/(gamma*gamma);
    389        // G4cout<<"bg = "<<bg<<";  b2 = "<<beta2<<G4endl<<G4endl;
     470       G4cout<<"bg = "<<bg<<";  b2 = "<<beta2<<G4endl<<G4endl;
    390471       rateMass = electron_mass_c2/proton_mass_c2;
    391 
    392        Tmax     = 2.0*electron_mass_c2*bg2
    393                    /(1.0+2.0*gamma*rateMass+rateMass*rateMass);
     472       
     473       Tmax = 2.0*electron_mass_c2*bg2/(1.0+2.0*gamma*rateMass+rateMass*rateMass);
     474       // Tmax = 0.5*kineticEnergy;
    394475
    395476       Tkin = maxEnergyTransfer;
     
    404485       }
    405486       G4PAIxSection testPAIproton(k,Tkin,bg2);
    406        
     487       /*       
    407488       G4cout 
    408489         //      << kineticEnergy/keV<<"\t\t"
     
    444525       //             <<testPAIproton.GetPAItable(1,j)*cm<<"\t\t"<<G4endl;
    445526
    446             
    447        /*
     527       */           
     528       
    448529       outFile<<testPAIproton.GetSplineSize()-1<<G4endl;
    449530
     
    451532       {
    452533       outFile
     534               << testPAIproton.GetSplineEnergy(i)/keV       << "\t"
     535         //  << testPAIproton.GetIntegralCerenkov(i)*cm    << "\t"
     536         //     << testPAIproton.GetIntegralMM(i)*cm    << "\t"
     537         //     << testPAIproton.GetIntegralPlasmon(i)*cm     << "\t"
     538         //      << testPAIproton.GetIntegralResonance(i)*cm   << "\t"
     539               << testPAIproton.GetIntegralPAIxSection(i)*cm << "\t"
     540               << G4endl;
     541
     542       G4cout
    453543               << testPAIproton.GetSplineEnergy(i)/keV       << "\t"
    454544               << testPAIproton.GetIntegralCerenkov(i)*cm    << "\t"
     
    458548               << testPAIproton.GetIntegralPAIxSection(i)*cm << "\t"
    459549               << G4endl;
     550
    460551       }
    461552       
    462        */
     553     
    463554
    464555       
Note: See TracChangeset for help on using the changeset viewer.