G4IonisParamElm.cc

Go to the documentation of this file.
00001 //
00002 // ********************************************************************
00003 // * License and Disclaimer                                           *
00004 // *                                                                  *
00005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
00006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
00007 // * conditions of the Geant4 Software License,  included in the file *
00008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
00009 // * include a list of copyright holders.                             *
00010 // *                                                                  *
00011 // * Neither the authors of this software system, nor their employing *
00012 // * institutes,nor the agencies providing financial support for this *
00013 // * work  make  any representation or  warranty, express or implied, *
00014 // * regarding  this  software system or assume any liability for its *
00015 // * use.  Please see the license in the file  LICENSE  and URL above *
00016 // * for the full disclaimer and the limitation of liability.         *
00017 // *                                                                  *
00018 // * This  code  implementation is the result of  the  scientific and *
00019 // * technical work of the GEANT4 collaboration.                      *
00020 // * By using,  copying,  modifying or  distributing the software (or *
00021 // * any work based  on the software)  you  agree  to acknowledge its *
00022 // * use  in  resulting  scientific  publications,  and indicate your *
00023 // * acceptance of all terms of the Geant4 Software license.          *
00024 // ********************************************************************
00025 //
00026 //
00027 // $Id: G4IonisParamElm.cc 67044 2013-01-30 08:50:06Z gcosmo $
00028 //
00029 //
00030 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
00031 //
00032 // 09-07-98, data moved from G4Element. M.Maire
00033 // 22-11-00, tabulation of ionisation potential from 
00034 //           the ICRU Report N#37. V.Ivanchenko
00035 // 08-03-01, correct handling of fShellCorrectionVector. M.Maire
00036 // 17-10-02, Fix excitation energy interpolation. V.Ivanchenko
00037 // 06-09-04, Update calculated values after any change of ionisation 
00038 //           potential change. V.Ivanchenko
00039 // 29-04-10, Using G4Pow and mean ionisation energy from NIST V.Ivanchenko
00040 // 27.10.11: new scheme for G4Exception  (mma)
00041 //
00042 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
00043 
00044 #include "G4IonisParamElm.hh"
00045 #include "G4NistManager.hh"
00046 #include "G4Pow.hh"
00047 #include "G4PhysicalConstants.hh"
00048 #include "G4SystemOfUnits.hh"
00049 
00050 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
00051 
00052 G4IonisParamElm::G4IonisParamElm(G4double AtomNumber)
00053 {
00054   G4int Z = G4int(AtomNumber + 0.5);
00055   if (Z < 1) {
00056     G4Exception("G4IonisParamElm::G4IonisParamElm()",  "mat501", FatalException,
00057                 "It is not allowed to create an Element with Z<1");
00058   }
00059   G4Pow* g4pow = G4Pow::GetInstance();
00060 
00061   // some basic functions of the atomic number
00062   fZ     = Z;
00063   fZ3    = g4pow->Z13(Z);
00064   fZZ3   = fZ3*g4pow->Z13(Z+1);
00065   flogZ3 = g4pow->logZ(Z)/3.;
00066    
00067   fMeanExcitationEnergy = 
00068     G4NistManager::Instance()->GetMeanIonisationEnergy(Z);
00069 
00070   // compute parameters for ion transport
00071   // The aproximation from:
00072   // J.F.Ziegler, J.P. Biersack, U. Littmark
00073   // The Stopping and Range of Ions in Matter,
00074   // Vol.1, Pergamon Press, 1985
00075   // Fast ions or hadrons
00076 
00077   G4int iz = Z - 1;
00078   if(91 < iz) { iz = 91; }
00079 
00080   static G4double vFermi[92] = {
00081     1.0309,  0.15976, 0.59782, 1.0781,  1.0486,  1.0,     1.058,   0.93942, 0.74562, 0.3424,
00082     0.45259, 0.71074, 0.90519, 0.97411, 0.97184, 0.89852, 0.70827, 0.39816, 0.36552, 0.62712,
00083     0.81707, 0.9943,  1.1423,  1.2381,  1.1222,  0.92705, 1.0047,  1.2,     1.0661,  0.97411,
00084     0.84912, 0.95,    1.0903,  1.0429,  0.49715, 0.37755, 0.35211, 0.57801, 0.77773, 1.0207,
00085     1.029,   1.2542,  1.122,   1.1241,  1.0882,  1.2709,  1.2542,  0.90094, 0.74093, 0.86054,
00086     0.93155, 1.0047,  0.55379, 0.43289, 0.32636, 0.5131,  0.695,   0.72591, 0.71202, 0.67413,
00087     0.71418, 0.71453, 0.5911,  0.70263, 0.68049, 0.68203, 0.68121, 0.68532, 0.68715, 0.61884,
00088     0.71801, 0.83048, 1.1222,  1.2381,  1.045,   1.0733,  1.0953,  1.2381,  1.2879,  0.78654,
00089     0.66401, 0.84912, 0.88433, 0.80746, 0.43357, 0.41923, 0.43638, 0.51464, 0.73087, 0.81065,
00090     1.9578,  1.0257} ;
00091 
00092   static G4double lFactor[92] = {
00093     1.0,  1.0,  1.1,  1.06, 1.01, 1.03, 1.04, 0.99, 0.95, 0.9,
00094     0.82, 0.81, 0.83, 0.88, 1.0,  0.95, 0.97, 0.99, 0.98, 0.97,
00095     0.98, 0.97, 0.96, 0.93, 0.91, 0.9,  0.88, 0.9,  0.9,  0.9,
00096     0.9,  0.85, 0.9,  0.9,  0.91, 0.92, 0.9,  0.9,  0.9,  0.9,
00097     0.9,  0.88, 0.9,  0.88, 0.88, 0.9,  0.9,  0.88, 0.9,  0.9,
00098     0.9,  0.9,  0.96, 1.2,  0.9,  0.88, 0.88, 0.85, 0.9,  0.9,
00099     0.92, 0.95, 0.99, 1.03, 1.05, 1.07, 1.08, 1.1,  1.08, 1.08,
00100     1.08, 1.08, 1.09, 1.09, 1.1,  1.11, 1.12, 1.13, 1.14, 1.15,
00101     1.17, 1.2,  1.18, 1.17, 1.17, 1.16, 1.16, 1.16, 1.16, 1.16,
00102     1.16, 1.16} ;
00103 
00104   fVFermi  = vFermi[iz];
00105   fLFactor = lFactor[iz];
00106 
00107   // obsolete parameters for ionisation
00108   fTau0 = 0.1*fZ3*MeV/proton_mass_c2;
00109   fTaul = 2.*MeV/proton_mass_c2;
00110 
00111   // compute the Bethe-Bloch formula for energy = fTaul*particle mass
00112   G4double rate = fMeanExcitationEnergy/electron_mass_c2 ;
00113   G4double w = fTaul*(fTaul+2.) ;
00114   fBetheBlochLow = (fTaul+1.)*(fTaul+1.)*std::log(2.*w/rate)/w - 1. ;
00115   fBetheBlochLow = 2.*fZ*twopi_mc2_rcl2*fBetheBlochLow ; 
00116   
00117   fClow = std::sqrt(fTaul)*fBetheBlochLow;
00118   fAlow = 6.458040 * fClow/fTau0;
00119   G4double Taum = 0.035*fZ3*MeV/proton_mass_c2;
00120   fBlow =-3.229020*fClow/(fTau0*std::sqrt(Taum));
00121 
00122   // Shell correction parameterization
00123   fShellCorrectionVector = new G4double[3]; //[3]
00124   rate = 0.001*fMeanExcitationEnergy/eV;
00125   G4double rate2 = rate*rate;
00126     /*    
00127     fShellCorrectionVector[0] = ( 1.10289e5 + 5.14781e8*rate)*rate2 ;
00128     fShellCorrectionVector[1] = ( 7.93805e3 - 2.22565e7*rate)*rate2 ;
00129     fShellCorrectionVector[2] = (-9.92256e1 + 2.10823e5*rate)*rate2 ;
00130     */
00131   fShellCorrectionVector[0] = ( 0.422377   + 3.858019*rate)*rate2 ;
00132   fShellCorrectionVector[1] = ( 0.0304043  - 0.1667989*rate)*rate2 ;
00133   fShellCorrectionVector[2] = (-0.00038106 + 0.00157955*rate)*rate2 ;
00134 }
00135 
00136 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
00137 
00138 // Fake default constructor - sets only member data and allocates memory
00139 //                            for usage restricted to object persistency
00140 
00141 G4IonisParamElm::G4IonisParamElm(__void__&)
00142   : fShellCorrectionVector(0)
00143 {
00144   fZ=fZ3=fZZ3=flogZ3=fTau0=fTaul=fBetheBlochLow=fAlow=fBlow=fClow
00145     =fMeanExcitationEnergy=fVFermi=fLFactor=0.0;
00146 }
00147 
00148 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
00149 
00150 G4IonisParamElm::~G4IonisParamElm()
00151 {
00152   if (fShellCorrectionVector) { delete [] fShellCorrectionVector; }
00153 }
00154 
00155 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
00156 
00157 G4IonisParamElm::G4IonisParamElm(G4IonisParamElm& right)
00158 {
00159   fShellCorrectionVector = 0;
00160   *this = right;
00161 }
00162 
00163 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
00164 
00165 G4IonisParamElm& G4IonisParamElm::operator=(const G4IonisParamElm& right)
00166 {
00167   if (this != &right)
00168     {
00169       fZ                     = right.fZ;
00170       fZ3                    = right.fZ3;
00171       fZZ3                   = right.fZZ3;
00172       flogZ3                 = right.flogZ3;
00173       fTau0                  = right.fTau0;
00174       fTaul                  = right.fTaul;
00175       fBetheBlochLow         = right.fBetheBlochLow;
00176       fAlow                  = right.fAlow;
00177       fBlow                  = right.fBlow;
00178       fClow                  = right.fClow;
00179       fMeanExcitationEnergy  = right.fMeanExcitationEnergy;
00180       fVFermi                = right.fVFermi;
00181       fLFactor               = right.fLFactor;
00182       if (fShellCorrectionVector) { delete [] fShellCorrectionVector; } 
00183       fShellCorrectionVector = new G4double[3];            
00184       fShellCorrectionVector[0] = right.fShellCorrectionVector[0];
00185       fShellCorrectionVector[1] = right.fShellCorrectionVector[1];
00186       fShellCorrectionVector[2] = right.fShellCorrectionVector[2];      
00187     } 
00188   return *this;
00189 }
00190 
00191 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
00192 
00193 G4int G4IonisParamElm::operator==(const G4IonisParamElm& right) const
00194 {
00195   return (this == (G4IonisParamElm *) &right);
00196 }
00197 
00198 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
00199 
00200 G4int G4IonisParamElm::operator!=(const G4IonisParamElm& right) const
00201 {
00202   return (this != (G4IonisParamElm *) &right);
00203 }
00204 
00205 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....

Generated on Mon May 27 17:48:39 2013 for Geant4 by  doxygen 1.4.7