Import Geant4 0.0.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-01 15:25:35 +02:00
parent 54d6b71f95
commit b97f8d0df7
3237 changed files with 807095 additions and 0 deletions
+23
View File
@@ -0,0 +1,23 @@
# $Id: GNUmakefile,v 2.2 1998/08/22 01:33:23 gcosmo Exp $
# --------------------------------------------------------------
# GNUmakefile for materials library. Gabriele Cosmo, 18/9/96.
# --------------------------------------------------------------
name := G4materials
ifndef G4INSTALL
G4INSTALL = ../..
endif
include $(G4INSTALL)/config/architecture.gmk
CPPFLAGS += -I$(G4BASE)/global/management/include \
-I$(G4BASE)/global/HEPRandom/include \
-I$(G4BASE)/global/HEPGeometry/include
include $(G4INSTALL)/config/common.gmk
.PHONY: global
global: lib
+64
View File
@@ -0,0 +1,64 @@
$Id: History,v 2.5 1998/08/13 09:58:23 maire Exp $
-------------------------------------------------------------------
=========================================================
Geant4 - an Object-Oriented Toolkit for Simulation in HEP
=========================================================
Category History file
---------------------
This file should be used by G4 developers and category coordinators
to briefly summarize all major modifications introduced in the code
and keep track of all category-tags.
It DOES NOT substitute the CVS log-message one should put at every
committal in the CVS repository !
----------------------------------------------------------
* Reverse chronological order (last date on top), please *
----------------------------------------------------------
August 13, 98 M.Maire - materials-00-02-01
new static method G4Material::GetMaterial(name)
July 17, 98 M.Maire - materials-00-01-04
correction in ComputeDensityCorrection() for gas
(G4IonisParamMat.cc)
July 10, 98 M.Maire - materials-00-01-03
Ionisation parameters put in a subclass
coworks with em-00-01-03
July 8, 98 M.Maire - materials-00-01-02
restored G4MaterialTable, ElementTable, ElementVector
to be compatible with pre-beta01-02
July 7, 98 M.Maire - materials-00-01-01
continue cleanup: Elements and Materials
new output formats: operator<< overloaded
June 30, 98 M.Maire - materials-00-07-01
new method AddMaterial() for mixture of mixtures.
start the cleanup of the category. G4Isotope done.
G4IsotopeTable typedef directly include in G4Isotope.hh
G4MaterialTest.cc illustrate all possible case to
define materials.
June 06, 98 M.Maire - materials-00-06-01
new G4AtomicShells class (Vladimir)
kState = kVacuum removed (minimal lower density set
by default)
April 17, 98 M.Maire - materials-00-05-01
April 08, 98 G.Cosmo
- Added fixes for DEC-cxx 6.0 compiler, related to for-loop index
declarations. Modified G4SandiaTable.cc.
March 5, 98 M.Maire - materials-00-04-01
January 29, 98 M.Maire - materials-00-03-01
December 19, 97 G.Cosmo - (alpha03)
- Created.
File diff suppressed because it is too large Load Diff
+201
View File
@@ -0,0 +1,201 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4Element.hh,v 2.8 1998/11/16 17:26:43 maire Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// ------------------- class G4Element -------------------
//
// Torre Wenaus, November 1995
//
// An element is a chemical element either directly defined in terms of
// its charactaristics: its name, symbol,
// Z (effective atomic number)
// N (effective number of nucleons)
// A (effective mass of a mole)
// or in terms of a collection of constituent isotopes with specified
// relative abundance (i.e. fraction of nb of atomes per volume).
//
// Quantities, with physical meaning or not, which are constant in a given
// element are computed and stored here as Derived data members.
//
// The class contains as a private static member the table of defined
// elements (an ordered vector of elements).
//
// Elements can be assembled singly or in mixtures into materials used
// in volume definitions via the G4Material class.
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// 09-07-96, new data members added by L.Urban
// 17-01-97, aesthetic rearrangement, M.Maire
// 20-01-97, Tsai formula for the rad length, M.Maire
// 21-01-97, remove mixture flag, M.Maire
// 24-01-97, new data member: fTaul
// new method: ComputeIonisationPara, M.Maire
// 20-03-97, corrected initialization of pointers, M.Maire
// 27-06-97, new function GetIsotope(int), M.Maire
// 24-02-98, fWeightVector becomes fRelativeAbundanceVector
// 27-04-98, atomic shell stuff, V. Grichine
// 09-07-98, Ionisation parameters removed from the class, M.Maire
// 04-08-98, new method GetElement(elementName), M.Maire
// 16-11-98, Subshell -> Shell, mma
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#ifndef G4ELEMENT_HH
#define G4ELEMENT_HH
#include "G4ios.hh"
#include <rw/tpvector.h>
#include <rw/tpordvec.h>
#include "globals.hh"
#include "G4Isotope.hh"
#include "G4AtomicShells.hh"
#include "G4IonisParamElm.hh"
typedef RWTPtrVector<G4Isotope> G4IsotopeVector;
class G4Element; //forward declaration
typedef RWTPtrOrderedVector<G4Element> G4ElementTable;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
class G4Element
{
public:
//
// Constructor to Build an element directly; no reference to isotopes
//
G4Element(const G4String& name, //its name
const G4String& symbol, //its symbol
G4double Zeff, //atomic number
G4double Aeff); //mass of mole
//
// Constructor to Build an element from isotopes via AddIsotope
//
G4Element(const G4String& name, //its name
const G4String& symbol, //its symbol
G4int nbIsotopes); //nb of isotopes
//
// Add an isotope to the element
//
void AddIsotope(G4Isotope* isotope, //isotope
G4double RelativeAbundance); //fraction of nb of
//atomes per volume
~G4Element();
//
// retrieval methods
//
G4String GetName() const {return fName;};
G4String GetSymbol() const {return fSymbol;};
G4double GetZ() const {return fZeff;};
G4double GetN() const {return fNeff;};
G4double GetA() const {return fAeff;};
G4int GetNbOfAtomicShells() const {return fNbOfAtomicShells;};
G4double GetAtomicShell(G4int) const;
G4IsotopeVector* GetIsotopeVector() const {return theIsotopeVector;};
size_t GetNumberOfIsotopes() const {return fNumberOfIsotopes;};
G4double* GetRelativeAbundanceVector() const {return fRelativeAbundanceVector;};
const G4Isotope* GetIsotope(G4int iso) const {return (*theIsotopeVector)[iso];};
static
const G4ElementTable* GetElementTable() {return &theElementTable;};
static
size_t GetNumberOfElements() {return theElementTable.length();};
size_t GetIndex() const {return fIndexInTable;};
static G4Element* GetElement(G4String name);
G4double GetfCoulomb() const {return fCoulomb;};
G4double GetfRadTsai() const {return fRadTsai;};
G4IonisParamElm* GetIonisation() const {return fIonisation;};
friend
ostream& operator<<(ostream&, G4Element*);
friend
ostream& operator<<(ostream&, G4Element&);
friend
ostream& operator<<(ostream&, G4ElementTable);
G4int operator==(const G4Element&) const;
G4int operator!=(const G4Element&) const;
private:
G4Element(G4Element &right);
const G4Element & operator=(const G4Element &right);
private:
void InitializePointers();
void ComputeDerivedQuantities();
void ComputeCoulombFactor();
void ComputeLradTsaiFactor();
private:
//
// Basic data members (which define an Element)
//
G4String fName; // name
G4String fSymbol; // symbol
G4double fZeff; // Effective atomic number
G4double fNeff; // Effective number of nucleons
G4double fAeff; // Effective mass of a mole
G4int fNbOfAtomicShells; // number of atomic shells
G4double* fAtomicShells ; // Pointer to atomic shell binding energies
// Isotope vector contains constituent isotopes of the element
size_t fNumberOfIsotopes; // Number of isotopes added to the element
G4IsotopeVector* theIsotopeVector;
G4double* fRelativeAbundanceVector; // Fraction of nb of atomes per volume
// for each constituent
// Set up the static Table of Elements
static G4ElementTable theElementTable;
size_t fIndexInTable; // Position of the element in the table
//
// Derived data members (computed from the basic data members)
//
G4double fCoulomb; // Coulomb correction factor
G4double fRadTsai; // Tsai formula for the radiation length
G4IonisParamElm* fIonisation; // Pointer to ionisation parameters
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
inline
G4Element* G4Element::GetElement(G4String elementName)
{
// search the element by its name
for (G4int J=0 ; J<theElementTable.length() ; J++)
{
if(theElementTable[J]->GetName() == elementName)
return theElementTable[J];
}
G4cerr << " Warning from GetElement(name). The element: " << elementName
<< " does not exist in the ElementTable. Return NULL pointer \n";
return NULL;
}
#endif
+27
View File
@@ -0,0 +1,27 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4ElementTable.hh,v 2.3 1998/07/12 03:00:29 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// ------------------------------------------------------------
// GEANT 4 class header file
//
// For information related to this code contact:
// CERN, CN Division, ASD group
// ---------------- G4ElementTable ----------------
// History:
// First implementation: Torre Wenaus, November 1995
// ------------------------------------------------------------
#ifndef G4ELEMENTTABLE_HH
#define G4ELEMENTTABLE_HH
#include "G4Element.hh"
#endif
+27
View File
@@ -0,0 +1,27 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4ElementVector.hh,v 2.3 1998/07/12 03:00:30 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// ------------------------------------------------------------
// GEANT 4 class header file
//
// For information related to this code contact:
// CERN, CN Division, ASD group
// ---------------- G4ElementVector ----------------
// History:
// First implementation: Torre Wenaus, November 1995
// ------------------------------------------------------------
#ifndef G4ELEMENTVECTOR_HH
#define G4ELEMENTVECTOR_HH
#include "G4Material.hh"
#endif
@@ -0,0 +1,79 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4IonisParamElm.hh,v 2.3 1998/07/13 17:13:50 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// ------------------- class G4IonisParamElm -------------------
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// 09-07-98, data moved from G4Element. M.Maire
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#ifndef G4IonisParamElm_HH
#define G4IonisParamElm_HH
#include "G4ios.hh"
#include "globals.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
class G4IonisParamElm
{
public:
G4IonisParamElm(G4double Z);
~G4IonisParamElm();
// retrieval methods
G4double GetZ() const {return fZ;};
G4double GetZ3() const {return fZ3;};
G4double GetZZ3() const {return fZZ3;};
G4double GetlogZ3() const {return flogZ3;};
G4double GetTau0() const {return fTau0;};
G4double GetTaul() const {return fTaul;};
G4double GetAlow() const {return fAlow;};
G4double GetBlow() const {return fBlow;};
G4double GetClow() const {return fClow;};
G4double GetMeanExcitationEnergy() const {return fMeanExcitationEnergy;};
G4double* GetShellCorrectionVector() const {return fShellCorrectionVector;};
G4int operator==(const G4IonisParamElm&) const;
G4int operator!=(const G4IonisParamElm&) const;
private:
G4IonisParamElm(G4IonisParamElm &right);
const G4IonisParamElm & operator=(const G4IonisParamElm &right);
private:
//
// data members
//
G4double fZ; // effective Z
G4double fZ3; // pow (Z,1/3)
G4double fZZ3; // pow (Z(Z+1),1/3)
G4double flogZ3; // log(Z)/3
// ------ ionisation loss ---------------------------------
G4double fTau0 ; // 0.1*pow(Z,1/3)*MeV/proton_mass_c2
G4double fTaul ; // 2*MeV/proton mass
G4double fBetheBlochLow; // Bethe-Bloch at fTaul*particle mass
G4double fAlow,fBlow,fClow; // parameters for the low energy ion.loss
G4double fMeanExcitationEnergy; // 16*pow(Z,0.9)*eV
G4double* fShellCorrectionVector; // shell correction coefficients
};
#endif
+106
View File
@@ -0,0 +1,106 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4IonisParamMat.hh,v 2.3 1998/07/13 17:13:51 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// 09-07-98, data moved from G4Material, M.Maire
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#ifndef G4IonisParamMat_HH
#define G4IonisParamMat_HH
#include "G4ios.hh"
#include "globals.hh"
class G4Material; // forward declaration
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
class G4IonisParamMat
{
public:
G4IonisParamMat(G4Material*);
~G4IonisParamMat();
//
// retrieval methods
//
G4double GetMeanExcitationEnergy() const {return fMeanExcitationEnergy;};
G4double GetLogMeanExcEnergy() const {return fLogMeanExcEnergy;};
G4double* GetShellCorrectionVector() const {return fShellCorrectionVector;};
G4double GetTaul() const {return fTaul;};
G4double GetCdensity() const {return fCdensity;};
G4double GetMdensity() const {return fMdensity;};
G4double GetAdensity() const {return fAdensity;};
G4double GetX0density() const {return fX0density;};
G4double GetX1density() const {return fX1density;};
G4double GetF1fluct() const {return fF1fluct;};
G4double GetF2fluct() const {return fF2fluct;};
G4double GetEnergy1fluct() const {return fEnergy1fluct;};
G4double GetLogEnergy1fluct() const {return fLogEnergy1fluct;};
G4double GetEnergy2fluct() const {return fEnergy2fluct;};
G4double GetLogEnergy2fluct() const {return fLogEnergy2fluct;};
G4double GetEnergy0fluct() const {return fEnergy0fluct;};
G4double GetRateionexcfluct() const {return fRateionexcfluct;};
G4int operator==(const G4IonisParamMat&) const;
G4int operator!=(const G4IonisParamMat&) const;
private:
G4IonisParamMat(const G4IonisParamMat&);
const G4IonisParamMat& operator=(const G4IonisParamMat&);
// Compute mean parameters : ExcitationEnergy,Shell corretion vector ...
void ComputeMeanParameters();
// Compute parameters for the density effect
void ComputeDensityEffect();
// Compute parameters for the energy fluctuation model
void ComputeFluctModel();
private:
//
// data members
//
G4Material* fMaterial; // this material
// parameters for energy loss calculation
G4double fMeanExcitationEnergy; //
G4double fLogMeanExcEnergy; //
G4double* fShellCorrectionVector; // shell correction coefficients
G4double fTaul; // lower limit of Bethe-Bloch formula
// parameters of the density correction....
G4double fCdensity; // mat.constant
G4double fMdensity; // exponent
G4double fAdensity; //
G4double fX0density; //
G4double fX1density; //
// parameters of the energy fluctuation model
G4double fF1fluct;
G4double fF2fluct;
G4double fEnergy1fluct;
G4double fLogEnergy1fluct;
G4double fEnergy2fluct;
G4double fLogEnergy2fluct;
G4double fEnergy0fluct;
G4double fRateionexcfluct;
};
#endif
+123
View File
@@ -0,0 +1,123 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4Isotope.hh,v 2.5 1998/08/05 10:30:28 maire Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// ------------------------------------------------------------
// GEANT 4 class header file
//
// For information related to this code contact:
// CERN, CN Division, ASD group
//
// ----------------- class G4Isotope ------------------
//
// Torre Wenaus, November 1995
//
// An isotope is a chemical isotope defined by its name,
// Z (atomic number),
// N (number of nucleons),
// A (mass of a mole).
//
// The class contains as a private static member the table of defined
// isotopes (an ordered vector of isotopes).
//
// Isotopes can be assembled into elements via the G4Element class.
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// 17-01-97, aesthetic rearrangement, M.Maire
// 04-08-98, new method GetIsotope(isotopeName), M.Maire
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#ifndef G4ISOTOPE_HH
#define G4ISOTOPE_HH
#include "G4ios.hh"
#include <rw/tpordvec.h>
#include "globals.hh"
class G4Isotope;
typedef RWTPtrOrderedVector<G4Isotope> G4IsotopeTable;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
class G4Isotope
{
public:
// Make an isotope
G4Isotope(const G4String& name, //its name
G4int z, //atomic number
G4int n, //number of nucleons
G4double a); //mass of mole
~G4Isotope();
// Retrieval methods
G4String GetName() const {return fName;};
G4int GetZ() const {return fZ;};
G4int GetN() const {return fN;};
G4double GetA() const {return fA;};
size_t GetIndex() const {return fIndexInTable;};
static G4Isotope* GetIsotope(G4String name);
static
const G4IsotopeTable* GetIsotopeTable() {return &theIsotopeTable;};
static size_t GetNumberOfIsotopes() {return theIsotopeTable.length();};
friend
ostream& operator<<(ostream&, G4Isotope*);
friend
ostream& operator<<(ostream&, G4Isotope&);
friend
ostream& operator<<(ostream&, G4IsotopeTable);
G4int operator==(const G4Isotope &right) const;
G4int operator!=(const G4Isotope &right) const;
private:
G4Isotope(G4Isotope &right);
G4Isotope & operator=(const G4Isotope &right);
private:
G4String fName; // name of the Isotope
G4int fZ; // atomic number
G4int fN; // number of nucleons
G4double fA; // mass of a mole
static
G4IsotopeTable theIsotopeTable;
size_t fIndexInTable; // index in the Isotope Table
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
inline
G4Isotope* G4Isotope::GetIsotope(G4String isotopeName)
{
// search the isotope by its name
for (G4int J=0 ; J<theIsotopeTable.length() ; J++)
{
if(theIsotopeTable[J]->GetName() == isotopeName)
return theIsotopeTable[J];
}
G4cerr << " Warning from GetIsotope(name). The isotope: " << isotopeName
<< " does not exist in the IsotopeTable. Return NULL pointer \n";
return NULL;
}
#endif
+27
View File
@@ -0,0 +1,27 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4IsotopeVector.hh,v 2.3 1998/07/12 03:00:33 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// ------------------------------------------------------------
// GEANT 4 class header file
//
// For information related to this code contact:
// CERN, CN Division, ASD group
// ---------------- G4IsotopeVector ----------------
// History:
// First implementation: Torre Wenaus, November 1995
// ------------------------------------------------------------
#ifndef G4ISOTOPEVECTOR_HH
#define G4ISOTOPEVECTOR_HH
#include "G4Element.hh"
#endif
+115
View File
@@ -0,0 +1,115 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4MPVEntry.hh,v 2.1 1998/07/13 17:13:55 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
////////////////////////////////////////////////////////////////////////
// G4MPVEntry Class Definition
////////////////////////////////////////////////////////////////////////
//
// File: G4MPVEntry.hh
// Description: A G4MPVEntry is an MaterialPropertyVector Entry.
// One Material Property Vector contains many MPVEntries
// Version: 1.0
// Created: 1996-02-08
// Author: Juliet Armstrong
// Updated: 1997-03-25 by Peter Gumplinger
// > cosmetics (only)
// mail: gum@triumf.ca
//
////////////////////////////////////////////////////////////////////////
#ifndef G4MPVEntry_h
#define G4MPVEntry_h 1
/////////////
// Includes
/////////////
#include "G4ios.hh"
#include "globals.hh"
/////////////////////
// Class Definition
/////////////////////
class G4MPVEntry {
public:
//////////////
// Operators
//////////////G4MPVEntry.hh
// Well defined semantics for these operators
// required by RWTPtrSortedVector
G4bool operator <(const G4MPVEntry &right) const;
G4bool operator ==(const G4MPVEntry &right) const;
G4MPVEntry& operator =(const G4MPVEntry &right);
///////////////////////////////
// Constructor and Destructor
///////////////////////////////
G4MPVEntry(G4double aPhotonMomentum, G4double aPropertyValue);
G4MPVEntry(const G4MPVEntry &right);
~G4MPVEntry();
////////////
// Methods
////////////
G4double GetPhotonMomentum();
G4double GetProperty();
//////////
// Tests
//////////
void DumpEntry();
private:
/////////////////////////
// Private Data members
/////////////////////////
G4double thePhotonMomentum;
G4double theProperty;
};
////////////////////
// Inline methods
////////////////////
// GetPhotonMomentum
// -----------------
//
inline
G4double G4MPVEntry::GetPhotonMomentum()
{
return thePhotonMomentum;
}
// GetProperty
// -----------
//
inline
G4double G4MPVEntry::GetProperty()
{
return theProperty;
}
#endif /* G4MPVEntry_h */
+283
View File
@@ -0,0 +1,283 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4Material.hh,v 2.10 1998/11/30 13:56:57 maire Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// ------------------- class G4Material ---------------------
//
// Torre Wenaus, November 1995
//
// Materials defined via the G4Material class are used to define the
// composition of Geant volumes.
// a Material is always made of Elements. It can be defined directly
// from scratch (defined by a single element), specifying :
// its name,
// density,
// state informations,
// and Z,A of the underlying Element.
// or in terms of a collection of constituent Elements with specified weights
// (composition specified either by fractional mass or atom counts).
//
// Quantities, with physical meaning or not, which are constant in a given
// material are computed and stored here as Derived data members.
// The class contains as a private static member the table of defined
// materials (an ordered vector of materials).
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// 10-07-96, new data members added by L.Urban
// 12-12-96, new data members added by L.Urban
// 20-01-97, aesthetic rearrangement. RadLength calculation modified
// Data members Zeff and Aeff REMOVED (i.e. passed to the Elements).
// (local definition of Zeff in DensityEffect and FluctModel...)
// Vacuum defined as a G4State. Mixture flag removed, M.Maire
// 29-01-97, State=Vacuum automatically set density=0 in the contructors.
// Subsequent protections have been put in the calculation of
// MeanExcEnergy, ShellCorrectionVector, DensityEffect, M.Maire
// 20-03-97, corrected initialization of pointers, M.Maire
// 10-06-97, new data member added by V.Grichine (fSandiaPhotoAbsCof)
// 27-06-97, new function GetElement(int), M.Maire
// 24-02-98, fFractionVector become fMassFractionVector
// 28-05-98, kState=kVacuum removed:
// The vacuum is an ordinary gas vith very low density, M.Maire
// 12-06-98, new method AddMaterial() allowing mixture of materials, M.Maire
// 09-07-98, Ionisation parameters removed from the class, M.Maire
// 04-08-98, new method GetMaterial(materialName), M.Maire
// 05-10-98, change name: NumDensity -> NbOfAtomsPerVolume
// 18-11-98, SandiaTable interface modified.
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#ifndef G4MATERIAL_HH
#define G4MATERIAL_HH
#include "G4ios.hh"
#include <rw/tpvector.h>
#include <rw/tpordvec.h>
#include "globals.hh"
#include "G4Element.hh"
#include "G4MaterialPropertiesTable.hh"
#include "G4IonisParamMat.hh"
#include "G4SandiaTable.hh"
typedef RWTPtrVector<G4Element> G4ElementVector;
class G4Material; //forward declaration
typedef RWTPtrOrderedVector<G4Material> G4MaterialTable;
enum G4State { kStateUndefined, kStateSolid, kStateLiquid, kStateGas };
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
class G4Material
{
public:
//
// Constructor to create a material from scratch.
//
G4Material(const G4String& name, //its name
G4double z, //atomic number
G4double a, //mass of mole
G4double density, //density
G4State state = kStateUndefined, //solid,liqid,gas
G4double temp = STP_Temperature, //temperature
G4double pressure = STP_Pressure); //pressure
//
// Constructor to create a material from a combination of elements
// and/or materials subsequently added via AddElement and/or AddMaterial
//
G4Material(const G4String& name, //its name
G4double density, //density
G4int nComponents, //nb of components
G4State state = kStateUndefined, //solid,liquid,gas
G4double temp = STP_Temperature, //temperature
G4double pressure = STP_Pressure); //pressure
//
// Add an element, giving number of atoms
//
void AddElement(G4Element* element, //the element
G4int nAtoms); //nb of atoms in a molecule
//
// Add an element or material, giving fraction of mass
//
void AddElement (G4Element* element , //the element
G4double fraction); //fraction of mass
void AddMaterial(G4Material* material, //the material
G4double fraction); //fraction of mass
~G4Material();
//
// retrieval methods
//
G4String GetName() const {return fName;};
G4double GetDensity() const {return fDensity;};
G4State GetState() const {return fState;};
G4double GetTemperature() const {return fTemp;};
G4double GetPressure() const {return fPressure;};
const
G4ElementVector* GetElementVector() const {return theElementVector;};
size_t GetNumberOfElements() const {return fNumberOfElements;};
const G4double* GetFractionVector() const {return fMassFractionVector;};
const G4int* GetAtomsVector() const {return fAtomsVector;};
const
G4Element* GetElement(G4int iel) const {return (*theElementVector)[iel];};
void SetMaterialPropertiesTable(G4MaterialPropertiesTable* anMPT)
{fMaterialPropertiesTable = anMPT;};
G4MaterialPropertiesTable* GetMaterialPropertiesTable() const
{return fMaterialPropertiesTable;};
static
const G4MaterialTable* GetMaterialTable() {return &theMaterialTable;};
static
size_t GetNumberOfMaterials() {return theMaterialTable.length();};
size_t GetIndex() const {return fIndexInTable;};
static G4Material* GetMaterial(G4String name);
const
G4double* GetVecNbOfAtomsPerVolume() const {return VecNbOfAtomsPerVolume;};
G4double GetTotNbOfAtomsPerVolume() const {return TotNbOfAtomsPerVolume;};
G4double GetTotNbOfElectPerVolume() const {return TotNbOfElectPerVolume;};
//obsolete names (5-10-98) see the 2 functions above
const
G4double* GetAtomicNumDensityVector() const {return VecNbOfAtomsPerVolume;};
G4double GetElectronDensity() const {return TotNbOfElectPerVolume;};
G4double GetRadlen() const {return fRadlen;};
G4IonisParamMat* GetIonisation() const {return fIonisation;};
G4SandiaTable* GetSandiaTable() const {return fSandiaTable;};
G4double GetZ() const;
G4double GetA() const;
friend
ostream& operator<<(ostream&, G4Material*);
friend
ostream& operator<<(ostream&, G4Material&);
friend
ostream& operator<<(ostream&, G4MaterialTable);
G4int operator==(const G4Material&) const;
G4int operator!=(const G4Material&) const;
private:
G4Material(const G4Material&);
const G4Material& operator=(const G4Material&);
void InitializePointers();
// Header routine for all derived quantities
void ComputeDerivedQuantities();
// Compute Radiation length
void ComputeRadiationLength();
private:
//
// Basic data members ( To define a material)
//
G4String fName; // Material name
G4double fDensity; // Material density
G4State fState; // Material state (defaults to undefined,
// determined internally based on density)
G4double fTemp; // Temperature (defaults to STP)
G4double fPressure; // Pressure (defaults to STP)
G4int maxNbComponents; // total number of components in the material
size_t fNumberOfComponents; // Number of components declared so far
size_t fNumberOfElements; // Number of Elements in the material
G4ElementVector* theElementVector; // vector of constituent Elements
G4double* fMassFractionVector; // composition by fractional mass
G4int* fAtomsVector; // composition by atom count
G4MaterialPropertiesTable* fMaterialPropertiesTable;
static
G4MaterialTable theMaterialTable; // the material table
size_t fIndexInTable; // Index of material in the material table
//
// Derived data members (computed from the basic data members)
//
// some general atomic properties
G4double* VecNbOfAtomsPerVolume; // vector of nb of atoms per volume
G4double TotNbOfAtomsPerVolume; // total nb of atoms per volume
G4double TotNbOfElectPerVolume; // total nb of electrons per volume
G4double fRadlen; // Radiation length
G4IonisParamMat* fIonisation; // ionisation parameters
G4SandiaTable* fSandiaTable; // Sandia table
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
inline
G4Material* G4Material::GetMaterial(G4String materialName)
{
// search the material by its name
for (G4int J=0 ; J<theMaterialTable.length() ; J++)
{
if(theMaterialTable[J]->GetName() == materialName)
return theMaterialTable[J];
}
G4cerr << " Warning from GetMaterial(name). The material: " << materialName
<< " does not exist in the MaterialTable. Return NULL pointer \n";
return NULL;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
inline
G4double G4Material::GetZ() const
{
if (fNumberOfElements > 1) {
G4cerr << "WARNING in GetZ. The material: " << fName << " is a mixture." << endl;
G4Exception ( " the Atomic number is not well defined." );
}
return (*theElementVector)(0)->GetZ();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
inline
G4double G4Material::GetA() const
{
if (fNumberOfElements > 1) {
G4cerr << "WARNING in GetA. The material: " << fName << " is a mixture." << endl;
G4Exception ( " the Atomic mass is not well defined." );
}
return (*theElementVector)(0)->GetA();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#endif
@@ -0,0 +1,107 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4MaterialPropertiesTable.hh,v 2.0 1998/07/02 17:19:40 gunter Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
////////////////////////////////////////////////////////////////////////
// G4MaterialPropertiesTable Definition
////////////////////////////////////////////////////////////////////////
//
// File: G4MaterialPropertiesTable.hh
// Description: An Material properties table is a hash table, with
// key = property name, and value = G4MaterialPropertyVector
// Version: 1.0
// Created: 1996-02-08
// Author: Juliet Armstrong
// Updated: 1997-03-25 by Peter Gumplinger
// > cosmetics (only)
// mail: gum@triumf.ca
//
////////////////////////////////////////////////////////////////////////
#ifndef G4MaterialPropertiesTable_h
#define G4MaterialPropertiesTable_h 1
/////////////
// Includes
/////////////
#include <math.h>
#include <rw/tphdict.h>
#include <rw/cstring.h>
#include "globals.hh"
#include "G4MaterialPropertyVector.hh"
#define RefractionIndex "RINDEX"
// unsigned hashString(const G4String &str);
/////////////////////
// Class Definition
/////////////////////
class G4MaterialPropertiesTable {
public:
//////////////
// Operators
//////////////
G4MaterialPropertiesTable&
operator =(const G4MaterialPropertiesTable &right);
////////////////
// Constructor
////////////////
G4MaterialPropertiesTable();
G4MaterialPropertiesTable(const G4MaterialPropertiesTable &right);
///////////////
// Destructor
///////////////
~G4MaterialPropertiesTable();
////////////
// Methods
////////////
void AddProperty(char *key,
G4double *PhotonMomenta,
G4double *PropertyValues,
G4int NumEntries);
void AddProperty(char *key, G4MaterialPropertyVector *opv);
void RemoveProperty(char *key);
G4MaterialPropertyVector* GetProperty(char *key);
void AddEntry(char *key, G4double aPhotonMomentum,
G4double aPropertyValue);
void RemoveEntry(char *key, G4double aPhotonMomentum);
void DumpTable();
private:
/////////////////////////
// Private Data members
/////////////////////////
RWTPtrHashDictionary<G4String, G4MaterialPropertyVector> MPT;
RWTPtrHashDictionaryIterator<G4String, G4MaterialPropertyVector>
MPTiterator;
};
#endif /* G4MaterialPropertiesTable_h */
@@ -0,0 +1,157 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4MaterialPropertyVector.hh,v 2.0 1998/07/02 17:19:42 gunter Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
////////////////////////////////////////////////////////////////////////
// G4MaterialPropertyVector Class Definition
////////////////////////////////////////////////////////////////////////
//
// File: G4MaterialPropertyVector.hh
//
// Description: A one-to-one mapping from Photon Momentum to some
// optical property
// Version: 1.0
// Created: 1996-02-08
// Author: Juliet Armstrong
// Updated: 1997-03-25 by Peter Gumplinger
// > value.h -> templates.hh
// mail: gum@triumf.ca
//
////////////////////////////////////////////////////////////////////////
#ifndef G4MaterialPropertyVector_h
#define G4MaterialPropertyVector_h 1
/////////////
// Includes
/////////////
#include <rw/tpsrtvec.h>
#include <rw/cstring.h>
#include "G4MPVEntry.hh"
/////////////////////
// Class Definition
/////////////////////
class G4MaterialPropertyVector {
public:
//////////////
// Operators
//////////////
G4bool operator ++();
G4MaterialPropertyVector&
operator =(const G4MaterialPropertyVector &right);
/////////////////
// Constructors
/////////////////
G4MaterialPropertyVector() : MPV(0)
{
CurrentEntry = -1;
NumEntries = 0;
};
G4MaterialPropertyVector(G4double *PhotonMomenta,
G4double *PropertyValues,
G4int NumElements);
G4MaterialPropertyVector(const G4MaterialPropertyVector &right);
///////////////
// Destructor
///////////////
~G4MaterialPropertyVector();
////////////
// Methods
////////////
void ResetIterator();
void AddElement(G4double aPhotonMomentum,
G4double aPropertyValue);
void RemoveElement(G4double aPhotonMomentum);
G4double GetProperty(G4double aPhotonMomentum) const;
G4double GetPhotonMomentum(G4double aProperty) const;
// for use with G4MaterialPropertyVector iterator:
// return property (or Photon momentum) at current point
// of iterator
G4double GetProperty() const;
G4double GetPhotonMomentum() const;
G4double GetMaxProperty() const;
G4double GetMinProperty() const;
G4double GetMaxPhotonMomentum() const;
G4double GetMinPhotonMomentum() const;
//////////
// Tests
//////////
void DumpVector();
private:
/////////////////////
// Helper Functions
/////////////////////
G4MPVEntry GetEntry(G4int i) const;
void GetAdjacentBins(G4double aPhotonMomentum,
G4int *left,G4int *right) const;
/////////////////////////
// Private Data Members
/////////////////////////
RWTPtrSortedVector<G4MPVEntry> MPV;
G4int NumEntries;
G4int CurrentEntry;
};
///////////////////
// Inline methods
///////////////////
inline
G4double G4MaterialPropertyVector::GetMaxProperty() const
{
return MPV.last()->GetProperty();
}
inline
G4double G4MaterialPropertyVector::GetMinProperty() const
{
return MPV.first()->GetProperty();
}
inline
G4double G4MaterialPropertyVector::GetMaxPhotonMomentum() const
{
return MPV.last()->GetPhotonMomentum();
}
inline
G4double G4MaterialPropertyVector::GetMinPhotonMomentum() const
{
return MPV.first()->GetPhotonMomentum();
}
#endif /* G4MaterialPropertyVector_h */
+27
View File
@@ -0,0 +1,27 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4MaterialTable.hh,v 2.3 1998/07/12 03:00:35 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// ------------------------------------------------------------
// GEANT 4 class header file
//
// For information related to this code contact:
// CERN, CN Division, ASD group
// ---------------- G4MaterialTable ----------------
// History:
// First implementation: Torre Wenaus, November 1995
// ------------------------------------------------------------
#ifndef G4MATERIALTABLE_HH
#define G4MATERIALTABLE_HH
#include "G4Material.hh"
#endif
@@ -0,0 +1,159 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4OpticalSurface.hh,v 2.0 1998/07/02 17:19:46 gunter Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
////////////////////////////////////////////////////////////////////////
// G4OpticalSurface Definition
////////////////////////////////////////////////////////////////////////
//
// File: G4OpticalSurface.hh
// Description: A optical surface class for use in G4OpBoundaryProcess
// Version: 2.0
// Created: 1997-06-26
// Author: Peter Gumplinger
// mail: gum@triumf.ca
//
// Cvs version:
////////////////////////////////////////////////////////////////////////
#ifndef G4OpticalSurface_h
#define G4OpticalSurface_h 1
/////////////
// Includes
/////////////
#include "globals.hh"
#include "templates.hh"
enum G4OpticalSurfaceFinish
{
polished, // smooth perfectly polished surface
polishedfrontpainted, // smooth top-layer (front) paint
polishedbackpainted, // same is 'polished' but with a back-paint
ground, // rough surface
groundfrontpainted, // rough top-layer (front) paint
groundbackpainted // same as 'ground' but with a back-paint
};
enum G4OpticalSurfaceType
{
dielectric_metal, // dielectric-metal interface
dielectric_dielectric // dielectric-dielectric interface
};
enum G4OpticalSurfaceModel
{
glisur, // original GEANT3 model
unified // UNIFIED model
};
class G4MaterialPropertiesTable;
/////////////////////
// Class Definition
/////////////////////
class G4OpticalSurface
{
public:
//////////////
// Operators
//////////////
G4OpticalSurface(const G4OpticalSurface &right);
const G4OpticalSurface & operator=(const G4OpticalSurface &right);
G4int operator==(const G4OpticalSurface &right) const;
G4int operator!=(const G4OpticalSurface &right) const;
public:
////////////////////////////////
// Constructors and Destructor
////////////////////////////////
G4OpticalSurface(const G4String& name,
G4OpticalSurfaceModel model = glisur,
G4OpticalSurfaceFinish finish = polished,
G4OpticalSurfaceType type = dielectric_dielectric,
G4double value = 1.0);
~G4OpticalSurface();
////////////
// Methods
////////////
public:
// public methods
G4String GetName() const { return theName; };
void SetName(const G4String& name){theName = name;};
// set/get the surface type
G4OpticalSurfaceType GetType() const {return theType;};
void SetType(const G4OpticalSurfaceType type){theType = type;};
// set/get the surface finish
G4OpticalSurfaceFinish GetFinish() const {return theFinish;};
void SetFinish(const G4OpticalSurfaceFinish finish)
{theFinish = finish;};
// set/get the surface model to be followed (glisur || unified)
G4OpticalSurfaceModel GetModel() const {return theModel;};
void SetModel(const G4OpticalSurfaceModel model)
{theModel = model;};
G4double GetSigmaAlpha() const {return sigma_alpha;};
void SetSigmaAlpha(const G4double s_a)
{sigma_alpha = s_a;};
G4double GetPolish() const {return polish;};
void SetPolish(const G4double plsh) {polish=plsh;};
void SetMaterialPropertiesTable(G4MaterialPropertiesTable *anMPT)
{ theMaterialPropertiesTable = anMPT;};
G4MaterialPropertiesTable* GetMaterialPropertiesTable() const
{ return theMaterialPropertiesTable;};
void DumpInfo() const;
private:
// ------------------
// Basic data members ( To define an optical surface)
// ------------------
G4String theName; // Surface name
G4OpticalSurfaceModel theModel; // Surface model
G4OpticalSurfaceFinish theFinish; // Surface finish
G4OpticalSurfaceType theType; // Surface type
G4double sigma_alpha; // The sigma of micro-facet polar angle
G4double polish; // Polish parameter in glisur model
G4MaterialPropertiesTable* theMaterialPropertiesTable;
};
////////////////////
// Inline methods
////////////////////
#endif /* G4OpticalSurface_h */
+138
View File
@@ -0,0 +1,138 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4SandiaTable.hh,v 2.2 1998/12/10 11:43:35 maire Exp $
// GEANT4 tag $Name: geant4-00 $
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
//
// 18.11.98 simplified public interface; new methods for materials. mma
// 10.06.97 created. V. Grichine
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#ifndef G4SANDIATABLE_HH
#define G4SANDIATABLE_HH
#include "G4OrderedTable.hh"
#include "G4ios.hh"
#include "globals.hh"
#include <assert.h>
class G4Material;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
class G4SandiaTable
{
public:
G4SandiaTable(G4Material*);
~G4SandiaTable();
static G4int GetNbOfIntervals (G4int Z);
static G4double GetSandiaCofPerAtom(G4int Z, G4int, G4int);
static G4double* GetSandiaCofPerAtom(G4int Z, G4double energy);
static G4double GetIonizationPot (G4int Z);
static G4double GetZtoA (G4int Z);
G4int GetMatNbOfIntervals() {return fMatNbOfIntervals;};
G4double GetSandiaCofForMaterial(G4int,G4int);
G4double* GetSandiaCofForMaterial(G4double energy);
private:
void ComputeMatSandiaMatrix();
private:
static const G4double fSandiaTable[981][5];
static const G4int fNbOfIntervals[101];
static G4int fCumulInterval[101];
static const G4double fZtoAratio[101];
static const G4double fIonizationPotentials[101];
static G4double fSandiaCofPerAtom[4];
G4Material* fMaterial;
G4int fMatNbOfIntervals;
G4OrderedTable* fMatSandiaMatrix;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// Inline function implementations
inline
G4int G4SandiaTable::GetNbOfIntervals(G4int Z)
{
return fNbOfIntervals[Z];
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
inline
G4double G4SandiaTable::GetSandiaCofPerAtom(G4int Z, G4int interval, G4int j)
{
assert (Z>0 && Z<101 && interval>=0 && interval<fNbOfIntervals[Z]
&& j>=0 && j<5);
G4int row = fCumulInterval[Z-1] + interval;
if (j==0) return fSandiaTable[row][0]*keV;
G4double AoverAvo = Z/(fZtoAratio[Z]*Avogadro*mole);
return fSandiaTable[row][j]*AoverAvo*cm2*pow(keV,(int)j);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
inline
G4double* G4SandiaTable::GetSandiaCofPerAtom(G4int Z, G4double energy)
{
assert (Z > 0);
G4int interval = fNbOfIntervals[Z] - 1;
G4int row = fCumulInterval[Z-1] + interval;
while ((interval>0) && (energy<fSandiaTable[row][0]*keV))
row = fCumulInterval[Z-1] + --interval;
if (energy >= fIonizationPotentials[Z]*eV)
{
G4double AoverAvo = Z/(fZtoAratio[Z]*Avogadro*mole);
fSandiaCofPerAtom[0]=fSandiaTable[row][1]*AoverAvo*cm2*keV;
fSandiaCofPerAtom[1]=fSandiaTable[row][2]*AoverAvo*cm2*keV*keV;
fSandiaCofPerAtom[2]=fSandiaTable[row][3]*AoverAvo*cm2*keV*keV*keV;
fSandiaCofPerAtom[3]=fSandiaTable[row][4]*AoverAvo*cm2*keV*keV*keV*keV;
}
else
fSandiaCofPerAtom[0] = fSandiaCofPerAtom[1] = fSandiaCofPerAtom[2] =
fSandiaCofPerAtom[3] = 0.;
return fSandiaCofPerAtom;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
inline
G4double G4SandiaTable::GetIonizationPot(G4int Z)
{
return fIonizationPotentials[Z]*eV;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
inline
G4double G4SandiaTable::GetZtoA(G4int Z)
{
return fZtoAratio[Z];
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#endif
File diff suppressed because it is too large Load Diff
+520
View File
@@ -0,0 +1,520 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4AtomicShells.cc,v 2.4 1998/11/16 17:26:45 maire Exp $
// GEANT4 tag $Name: geant4-00 $
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// 24-04-98, implementation of the first version, V. Grichine
// 16-11-98, GetBindingEnergy(Z,ShellNb), M.Maire
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#include "G4AtomicShells.hh"
#include <assert.h>
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
const G4int
G4AtomicShells::fNumberOfShells[101] =
{
0 , // nonexisting zero element
1 , 1 , 2 , 2 , 3 , 3 , 4 , 4 , 3 , 4 , // 1 - 10
5 , 5 , 6 , 6 , 6 , 6 , 6 , 7 , 8 , 8 , // 11 - 20
9 , 9 , 9 , 9 , 9 , 9 , 9 , 10 , 10 , 10 , // 21 - 30
11 , 11 , 11 , 11 , 11 , 12 , 13 , 13 , 14 , 14 , // 31 - 40
14 , 14 , 14 , 14 , 14 , 15 , 15 , 15 , 16 , 16 , // 41 - 50
// ----------------------------------------------------------
16 , 16 , 16 , 17 , 18 , 18 , 19 , 19 , 19 , 19 , // 51 - 60
19 , 19 , 19 , 20 , 19 , 19 , 19 , 19 , 19 , 20 , // 61 - 70
21 , 21 , 21 , 21 , 21 , 21 , 21 , 21 , 22 , 22 , // 71 - 80
23 , 23 , 23 , 23 , 24 , 24 , 25 , 25 , 26 , 26 , // 81 - 90
27 , 27 , 27 , 26 , 26 , 27 , 27 , 26 , 26 , 26 // 91 - 100
};
// The total shell number is:
// 1 + G4AtomicShells::TotalNumberOfShells(100) = 1 + 1539 = 1540
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
const G4double
G4AtomicShells::fBindingEnergies[1540] =
{
0.0 , // Nonexisting zero element
// H ---------------------------------------------------------
13.60 ,
// He ---------------------------------------------------------
24.59 ,
// Li --------------------------------------------------------
58.0 , 5.39 ,
// Be --------------------------------------------------------
115.0 , 9.32 ,
// B --------------------------------------------------------
192.0 , 12.93 , 8.3 ,
// C ---------------------------------------------------------
288.0 , 16.59 , 11.26 ,
// N ---------------------------------------------------------
403.0 , 37.3 , 20.33 , 14.53 ,
// O ---------------------------------------------------------
543.1 , 41.6 , 28.48 , 13.62 ,
// F ---------------------------------------------------------
696.7 , 37.85 , 17.42 ,
// Ne ---------------------------------------------------------
870.1 , 48.47 , 21.66 , 21.56 ,
// Na ---------------------------------------------------------
1075.0 , 66.0 , 34.0 , 34.0 , 5.14 ,
// Mg ---------------------------------------------------------
1308.0 , 92.0 , 54.0 , 54.0 , 7.65 ,
// Al ---------------------------------------------------------
1564.0 , 121. , 77.0 , 77.0 , 10.62 , 5.99 ,
// Si ---------------------------------------------------------
1844.0 , 154.0 , 104.0 , 104.0 , 13.46 , 8.15 ,
// P ---------------------------------------------------------
2148.0 , 191.0 , 135.0 , 134.0 , 16.15 , 10.49 ,
// S ---------------------------------------------------------
2476.0 , 232.0 , 170.0 , 168.0 , 20.20 , 10.36 ,
// Cl ---------------------------------------------------------
2829.0 , 277.0 , 208.0 , 206.0 , 24.54 , 12.97 ,
// Ar ---------------------------------------------------------
3206.3 , 326.5 , 250.6 , 248.5 , 29.24 , 15.94 , 15.76 ,
// K ---------------------------------------------------------
3610.0 , 381.0 , 299.0 , 296.0 , 37.0 , 19.0 , 18.7 , 4.34 ,
// Ca ---------------------------------------------------------
4041.0 , 441.0 , 353.0 , 349.0 , 46.0 , 28.0 , 28.0 , 6.11 ,
// Sc ---------------------------------------------------------
4494.0 , 503.0 , 408.0 , 403.0 , 55.0 , 33.0 , 33.0 , 8.0 , 6.54 ,
// Ti ---------------------------------------------------------
4966.0 , 567.0 , 465.0 , 459.0 , 64.0 , 39.0 , 38.0 , 8.0 , 6.82 ,
// V ---------------------------------------------------------
5465.0 , 633.0 , 525.0 , 518.0 , 72.0 , 44.0 , 43.0 , 8.0 , 6.74 ,
// Cr ---------------------------------------------------------
5989.0 , 702.0 , 589.0 , 580.0 , 80.0 , 49.0 , 48.0 , 8.25 , 6.77 ,
// Mn ---------------------------------------------------------
6539.0 , 755.0 , 656.0 , 645.0 , 89.0 , 55.0 , 53.0 , 9.0 , 7.43 ,
// Fe ---------------------------------------------------------
7112.0 , 851.0 , 726.0 , 713.0 , 98.0 , 61.0 , 59.0 , 9.0 , 7.87 ,
// Co ---------------------------------------------------------
7709.0 , 931.0 , 800.0 , 785.0 , 107.0 , 68.0 , 66.0 , 9.0 , 7.86 ,
// Ni ---------------------------------------------------------
8333.0 , 1015.0 , 877.0 , 860.0 , 117.0 , 75.0 , 73.0 , 10.0 , 10.0 ,
7.64 ,
// Cu ---------------------------------------------------------
8979.0 , 1103.0 , 958.0 , 938.0 , 127.0 , 82.0 , 80.0 , 11.0 , 10.4 ,
7.73 ,
// Zn ---------------------------------------------------------
9659.0 , 1198.0 , 1047.0 , 1024.0 , 141.0 , 94.0 , 91.0 , 12.0 , 11.2 ,
9.39 ,
// Ga ---------------------------------------------------------
10367.0 , 1302.0 , 1146.0 , 1119.0 , 162.0 , 111.0 , 107.0 , 21.0 ,
20.0 , 11.0 , 6.0 ,
// Ge ---------------------------------------------------------
11103.0 , 1413.0 , 1251.0 , 1220.0 , 184.0 , 130.0 , 125.0 , 33.0 ,
32.0 , 14.3 , 7.9 ,
// As ---------------------------------------------------------
11867.0 , 1531.0 , 1362.0 , 1327.0 , 208.0 , 151.0 , 145.0 , 46.0 ,
45.0 , 17.0 , 9.81 ,
// Se ---------------------------------------------------------
12658.0 , 1656.0 , 1479.0 , 1439.0 , 234.0 , 173.0 , 166.0 , 61.0 ,
60.0 , 20.15 , 9.75 ,
// Br ---------------------------------------------------------
13474.0 , 1787.0 , 1602.0 , 1556.0 , 262.0 , 197.0 , 189.0 , 77.0 ,
76.0 , 23.8 , 11.85 ,
// Kr ---------------------------------------------------------
14326.0 , 1924.6 , 1730.9 , 1678.4 , 292.8 , 222.2 , 214.4 , 95.0 ,
93.8 , 27.51 , 14.65 , 14.0 ,
// Rb ---------------------------------------------------------
15200.0 , 2068.0 , 1867.0 , 1807.0 , 325.0 , 251.0 , 242.0 , 116.0 ,
114.0 , 32.0 , 16.0 , 15.3 , 4.18 ,
// Sr ---------------------------------------------------------
16105.0 , 2219.0 , 2010.0 , 1943.0 , 361.0 , 283.0 , 273.0 , 139.0 ,
137.0 , 40.0 , 23.0 , 22.0 , 5.69 ,
// Y ---------------------------------------------------------
17038.0 , 2375.0 , 2158.0 , 2083.0 , 397.0 , 315.0 , 304.0 , 163.0 ,
161.0 , 48.0 , 30.0 , 29.0 , 6.38 , 6.48 ,
// Zr ---------------------------------------------------------
17998.0 , 2536.0 , 2311.0 , 2227.0 , 434.0 , 348.0 , 335.0 , 187.0 ,
185.0 , 56.0 , 35.0 , 33.0 , 8.61 , 6.84 ,
// Nb ----------------------------------------------------------
18986.0 , 2702.0 , 2469.0 , 2375.0 , 472.0 , 382.0 , 367.0 , 212.0 ,
209.0 , 62.0 , 40.0 , 38.0 , 7.17 , 6.88 ,
// Mo -----------------------------------------------------------
20000.0 , 2872.0 , 2632.0 , 2527.0 , 511.0 , 416.0 , 399.0 , 237.0 ,
234.0 , 68.0 , 45.0 , 42.0 , 8.56 , 7.10 ,
// Tc -----------------------------------------------------------
21044.0 , 3048.0 , 2800.0 , 2683.0 , 551.0 , 451.0 , 432.0 , 263.0 ,
259.0 , 74.0 , 49.0 , 45.0 , 8.6 , 7.28 ,
// Ru -----------------------------------------------------------
22117.0 , 3230.0 , 2973.0 , 2844.0 , 592.0 , 488.0 , 466.0 , 290.0 ,
286.0 , 81.0 , 53.0 , 49.0 , 8.5 , 7.37 ,
// Rh -----------------------------------------------------------
23220.0 , 3418.0 , 3152.0 , 3010.0 , 634.0 , 526.0 , 501.0 , 318.0 ,
313.0 , 87.0 , 58.0 , 53.0 , 9.56 , 7.46 ,
// Pd -----------------------------------------------------------
24350.0 , 3611.0 , 3337.0 , 3180.0 , 677.0 , 565.0 , 537.0 , 347.0 ,
342.0 , 93.0 , 63.0 , 57.0 , 8.78 , 8.34 , 7.52 ,
// Ag -----------------------------------------------------------
25514.0 , 3812.0 , 3530.0 , 3357.0 , 724.0 , 608.0 , 577.0 , 379.0 ,
373.0 , 101.0 , 69.0 , 63.0 , 11.0 , 10.0 , 7.58 ,
// Cd ------------------------------------------------------------
26711.0 , 4022.0 , 3732.0 , 3542.0 , 775.0 , 655.0 , 621.0 , 415.0 ,
408.0 , 112.0 , 78.0 , 71.0 , 14.0 , 13.0 , 8.99 ,
// In ------------------------------------------------------------
27940.0 , 4242.0 , 3943.0 , 3735.0 , 830.0 , 707.0 , 669.0 , 455.0 ,
447.0 , 126.0 , 90.0 , 82.0 , 21.0 , 20.0 , 10.0 , 5.79 ,
// Sn ------------------------------------------------------------
29200.0 , 4469.0 , 4160.0 , 3933.0 , 888.0 , 761.0 , 719.0 , 497.0 ,
489.0 , 141.0 , 102.0 , 93.0 , 29.0 , 28.0 , 12.0 , 7.34 ,
// Sb ------------------------------------------------------------
30419.0 , 4698.0 , 4385.0 , 4137.0 , 949.0 , 817.0 , 771.0 , 542.0 ,
533.0 , 157.0 , 114.0 , 104.0 , 38.0 , 37.0 , 15.0 , 8.64 ,
// Te ------------------------------------------------------------
31814.0 , 4939.0 , 4612.0 , 4347.0 , 1012.0 , 876.0 , 825.0 , 589.0 ,
578.0 , 174.0 , 127.0 , 117.0 , 48.0 , 46.0 , 17.84 , 9.01 ,
// I ------------------------------------------------------------
33169.0 , 5188.0 , 4852.0 , 4557.0 , 1078.0 , 937.0 , 881.0 , 638.0 ,
626.0 , 193.0 , 141.0 , 131.0 , 58.0 , 56.0 , 20.61 , 10.45 ,
// Xe ------------------------------------------------------------
34570.0 , 5460.0 , 5110.0 , 4790.0 , 1148.7 , 1002.1 , 940.6 , 689.0 ,
676.4 , 213.2 , 157.0 , 145.5 , 69.5 , 67.5 , 23.39 , 13.43 ,
12.13 ,
// Cs ------------------------------------------------------------
35985.0 , 5714.0 , 5359.0 , 5012.0 , 1220.0 , 1068.0 , 1000.0 , 742.0 ,
728.0 , 233.0 , 174.0 , 164.0 , 81.0 , 79.0 , 25.0 , 14.0 ,
12.3 , 3.89 ,
// Ba -------------------------------------------------------------
37441.0 , 5989.0 , 5624.0 , 5247.0 , 1293.0 , 1138.0 , 1063.0 , 797.0 ,
782.0 , 254.0 , 193.0 , 181.0 , 94.0 , 92.0 , 31.0 , 18.0 ,
16.0 , 5.21 ,
// La -------------------------------------------------------------
38925.0 , 6266.0 , 5891.0 , 5483.0 , 1365.0 , 1207.0 , 1124.0 , 851.0 ,
834.0 , 273.0 , 210.0 , 196.0 , 105.0 , 103.0 , 36.0 , 22.0 ,
19.0 , 5.75 , 5.58 ,
// Ce -------------------------------------------------------------
40443.0 , 6548.0 , 6164.0 , 5723.0 , 1437.0 , 1275.0 , 1184.0 , 903.0 ,
885.0 , 291.0 , 225.0 , 209.0 , 114.0 , 111.0 , 6.0 , 39.0 ,
25.0 , 22.0 , 5.65 ,
// Pr -------------------------------------------------------------
41991.0 , 6835.0 , 6440.0 , 5964.0 , 1509.0 , 1342.0 , 1244.0 , 954.0 ,
934.0 , 307.0 , 238.0 , 220.0 , 121.0 , 117.0 , 6.0 , 41.0 ,
27.0 , 24.0 , 5.42 ,
// Nd -------------------------------------------------------------
43569.0 , 7126.0 , 6722.0 , 6208.0 , 1580.0 , 1408.0 , 1303.0 , 1005.0 ,
983.0 , 321.0 , 250.0 , 230.0 , 126.0 , 122.0 , 6.0 , 42.0 ,
28.0 , 25.0 , 5.49 ,
// Pm -------------------------------------------------------------
45184.0 , 7428.0 , 7013.0 , 6459.0 , 1653.0 , 1476.0 , 1362.0 , 1057.0 ,
1032.0 , 325.0 , 261.0 , 240.0 , 131.0 , 127.0 , 6.0 , 43.0 ,
28.0 , 25.0 , 5.55 ,
// Sm -------------------------------------------------------------
46834.0 , 7737.0 , 7312.0 , 6716.0 , 1728.0 , 1546.0 , 1422.0 , 1110.0 ,
1083.0 , 349.0 , 273.0 , 251.0 , 137.0 , 132.0 , 6.0 , 44.0 ,
29.0 , 25.0 , 5.63 ,
// Eu -------------------------------------------------------------
48519.0 , 8052.0 , 7617.0 , 6977.0 , 1805.0 , 1618.0 , 1484.0 , 1164.0 ,
1135.0 , 364.0 , 286.0 , 262.0 , 143.0 , 137.0 , 6.0 , 45.0 ,
30.0 , 26.0 , 5.68 ,
// Gd -------------------------------------------------------------
50239.0 , 8376.0 , 7930.0 , 7243.0 , 1884.0 , 1692.0 , 1547.0 , 1220.0 ,
1189.0 , 380.0 , 300.0 , 273.0 , 150.0 , 143.0 , 6.0 , 46.0 ,
31.0 , 27.0 , 6.0 , 6.16 ,
// Tb -------------------------------------------------------------
51996.0 , 8708.0 , 8252.0 , 7514.0 , 1965.0 , 1768.0 , 1612.0 , 1277.0 ,
1243.0 , 398.0 , 315.0 , 285.0 , 157.0 , 150.0 , 6.0 , 48.0 ,
32.0 , 28.0 , 5.85 ,
// Dy -------------------------------------------------------------
53789.0 , 9046.0 , 8581.0 , 7790.0 , 2048.0 , 1846.0 , 1678.0 , 1335.0 ,
1298.0 , 416.0 , 331.0 , 297.0 , 164.0 , 157.0 , 6.0 , 50.0 ,
33.0 , 28.0 , 5.93 ,
// Ho -------------------------------------------------------------
55618.0 , 9394.0 , 8918.0 , 8071.0 , 2133.0 , 1926.0 , 1746.0 , 1395.0 ,
1354.0 , 434.0 , 348.0 , 310.0 , 172.0 , 164.0 , 6.0 , 52.0 ,
34.0 , 29.0 , 6.02 ,
// Er -------------------------------------------------------------
57486.0 , 9751.0 , 9264.0 , 8358.0 , 2220.0 , 2008.0 , 1815.0 , 1456.0 ,
1412.0 , 452.0 , 365.0 , 323.0 , 181.0 , 172.0 , 6.0 , 54.0 ,
35.0 , 30.0 , 6.10 ,
// Tu -------------------------------------------------------------
59390.0 , 10116.0 , 9617.0 , 8648.0 , 2309.0 , 2092.0 , 1885.0 , 1518.0 ,
1471.0 , 471.0 , 382.0 , 336.0 , 190.0 , 181.0 , 7.0 , 56.0 ,
36.0 , 30.0 , 6.18 ,
// Yb -------------------------------------------------------------
61332.0 , 10486.0 , 9978.0 , 8944.0 , 2401.0 , 2178.0 , 1956.0 , 1580.0 ,
1531.0 , 490.0 , 399.0 , 349.0 , 200.0 , 190.0 , 8.0 , 7.0 ,
58.0 , 37.0 , 31.0 , 6.25 ,
// Lu -------------------------------------------------------------
63314.0 , 10870.0 , 10349.0 , 9244.0 , 2499.0 , 2270.0 , 2032.0 , 1647.0 ,
1596.0 , 514.0 , 420.0 , 366.0 , 213.0 , 202.0 , 13.0 , 12.0 ,
62.0 , 39.0 , 32.0 , 6.6 , 7.0 ,
// Hf -------------------------------------------------------------
65351.0 , 11271.0 , 10739.0 , 9561.0 , 2604.0 , 2369.0 , 2113.0 , 1720.0 ,
1665.0 , 542.0 , 444.0 , 386.0 , 229.0 , 217.0 , 21.0 , 20.0 ,
68.0 , 43.0 , 35.0 , 7.0 , 7.5 ,
// Ta -------------------------------------------------------------
67416.0 , 11682.0 , 11136.0 , 9881.0 , 2712.0 , 2472.0 , 2197.0 , 1796.0 ,
1737.0 , 570.0 , 469.0 , 407.0 , 245.0 , 232.0 , 30.0 , 28.0 ,
74.0 , 47.0 , 38.0 , 8.3 , 7.9 ,
// W -------------------------------------------------------------
69525.0 , 12100.0 , 11544.0 , 10207.0 , 2823.0 , 2577.0 , 2283.0 , 1874.0 ,
1811.0 , 599.0 , 495.0 , 428.0 , 261.0 , 248.0 , 38.0 , 36.0 ,
80.0 , 51.0 , 41.0 , 9.0 , 8.0 ,
// Re -------------------------------------------------------------
71676.0 , 12527.0 , 11959.0 , 10535.0 , 2937.0 , 2686.0 , 2371.0 , 1953.0 ,
1887.0 , 629.0 , 522.0 , 450.0 , 278.0 , 264.0 , 47.0 , 45.0 ,
86.0 , 56.0 , 45.0 , 9.6 , 7.9 ,
// Os -------------------------------------------------------------
73871.0 , 12968.0 , 12385.0 , 10871.0 , 3054.0 , 2797.0 , 2461.0 , 2035.0 ,
1964.0 , 660.0 , 551.0 , 473.0 , 295.0 , 280.0 , 56.0 , 54.0 ,
92.0 , 61.0 , 49.0 , 9.6 , 8.5 ,
// Ir -------------------------------------------------------------
76111.0 , 13419.0 , 12824.0 , 11215.0 , 3175.0 , 2912.0 , 2554.0 , 2119.0 ,
2044.0 , 693.0 , 581.0 , 497.0 , 314.0 , 298.0 , 67.0 , 64.0 ,
99.0 , 66.0 , 53.0 , 9.6 , 9.1 ,
// Pt -------------------------------------------------------------
78395.0 , 13880.0 , 13273.0 , 11564.0 , 3300.0 , 3030.0 , 2649.0 , 2206.0 ,
2126.0 , 727.0 , 612.0 , 522.0 , 335.0 , 318.0 , 78.0 , 75.0 ,
106.0 , 71.0 , 57.0 , 9.6 , 9.0 ,
// Au -------------------------------------------------------------
80725.0 , 14353.0 , 13734.0 , 11919.0 , 3430.0 , 3153.0 , 2748.0 , 2295.0 ,
2210.0 , 764.0 , 645.0 , 548.0 , 357.0 , 339.0 , 91.0 , 87.0 ,
114.0 , 76.0 , 61.0 , 12.5 , 11.1 , 9.23 ,
// Hg -------------------------------------------------------------
83102.0 , 14839.0 , 14209.0 , 12284.0 , 3567.0 , 3283.0 , 2852.0 , 2390.0 ,
2300.0 , 806.0 , 683.0 , 579.0 , 382.0 , 363.0 , 107.0 , 103.0 ,
125.0 , 85.0 , 68.0 , 14.0 , 12.0 , 10.4 ,
// Tl -------------------------------------------------------------
85530.0 , 15347.0 , 14698.0 , 12658.0 , 3710.0 , 3420.0 , 2961.0 , 2490.0 ,
2394.0 , 852.0 , 726.0 , 615.0 , 411.0 , 391.0 , 127.0 , 123.0 ,
139.0 , 98.0 , 79.0 , 21.0 , 19.0 , 8.0 , 6.11 ,
// Pb -------------------------------------------------------------
88005.0 , 15861.0 , 15200.0 , 13055.0 , 3857.0 , 3560.0 , 3072.0 , 2592.0 ,
2490.0 , 899.0 , 769.0 , 651.0 , 441.0 , 419.0 , 148.0 , 144.0 ,
153.0 , 111.0 , 90.0 , 27.0 , 25.0 , 10.0 , 7.42 ,
// Bi -------------------------------------------------------------
90526.0 , 16388.0 , 15711.0 , 13419.0 , 4007.0 , 3704.0 , 3185.0 , 2696.0 ,
2588.0 , 946.0 , 813.0 , 687.0 , 472.0 , 448.0 , 170.0 , 165.0 ,
167.0 , 125.0 , 101.0 , 34.0 , 32.0 , 12.0 , 7.29 ,
// Po -------------------------------------------------------------
93105.0 , 16939.0 , 16244.0 , 13814.0 , 4161.0 , 3852.0 , 3301.0 , 2802.0 ,
2687.0 , 994.0 , 858.0 , 724.0 , 503.0 , 478.0 , 193.0 , 187.0 ,
181.0 , 139.0 , 112.0 , 41.0 , 38.0 , 15.0 , 8.43 ,
// At -------------------------------------------------------------
95730.0 , 17493.0 , 16785.0 , 14214.0 , 4320.0 , 4005.0 , 3420.0 , 2910.0 ,
2788.0 , 1044.0 , 904.0 , 761.0 , 535.0 , 508.0 , 217.0 , 211.0 ,
196.0 , 153.0 , 123.0 , 48.0 , 44.0 , 19.0 , 11.0 , 9.3 ,
// Rn -------------------------------------------------------------
98404.0 , 18049.0 , 17337.0 , 14619.0 , 4483.0 , 4162.0 , 3452.0 , 3109.0 ,
2890.0 , 1096.0 , 951.0 , 798.0 , 567.0 , 538.0 , 242.0 , 235.0 ,
212.0 , 167.0 , 134.0 , 55.0 , 51.0 , 24.0 , 14.0 , 10.7 ,
// Fr -------------------------------------------------------------
101137.0 , 18639.0 , 17907.0 , 15031.0 , 4652.0 , 4324.0 , 3666.0 , 3134.0 ,
2998.0 , 1153.0 , 1003.0 , 839.0 , 603.0 , 572.0 , 268.0 , 260.0 ,
231.0 , 183.0 , 147.0 , 65.0 , 61.0 , 33.0 , 19.0 , 14.0 ,
4.0 ,
// Ra -------------------------------------------------------------
103922.0 , 19237.0 , 18484.0 , 15444.0 , 4822.0 , 4491.0 , 3793.0 , 3254.0 ,
3111.0 , 1214.0 , 1060.0 , 884.0 , 642.0 , 609.0 , 296.0 , 287.0 ,
253.0 , 201.0 , 161.0 , 77.0 , 73.0 , 40.0 , 25.0 , 19.0 ,
5.28 ,
// Ac -------------------------------------------------------------
106755.0 , 19840.0 , 19083.0 , 15871.0 , 5002.0 , 4656.0 , 3921.0 , 3374.0 ,
3223.0 , 1274.0 , 1116.0 , 928.0 , 680.0 , 645.0 , 322.0 , 313.0 ,
274.0 , 218.0 , 174.0 , 88.0 , 83.0 , 45.0 , 29.0 , 22.0 ,
5.7 , 6.3 ,
// Th -------------------------------------------------------------
109651.0 , 20472.0 , 19693.0 , 16300.0 , 5182.0 , 4830.0 , 4049.0 , 3494.0 ,
3335.0 , 1333.0 , 1171.0 , 970.0 , 717.0 , 679.0 , 347.0 , 338.0 ,
293.0 , 233.0 , 185.0 , 97.0 , 91.0 , 50.0 , 33.0 , 25.0 ,
6.0 , 6.0 ,
// Pa -------------------------------------------------------------
112601.0 , 21105.0 , 20314.0 , 16733.0 , 5367.0 , 5001.0 , 4178.0 , 3613.0 ,
3446.0 , 1390.0 , 1225.0 , 1011.0 , 752.0 , 712.0 , 372.0 , 362.0 ,
312.0 , 248.0 , 195.0 , 104.0 , 97.0 , 6.0 , 50.0 , 32.0 ,
24.0 , 6.0 , 6.0 ,
// U -------------------------------------------------------------
115606.0 , 21757.0 , 20948.0 , 17166.0 , 5548.0 , 5182.0 , 4308.0 , 3733.0 ,
3557.0 , 1446.0 , 1278.0 , 1050.0 , 785.0 , 743.0 , 396.0 , 386.0 ,
329.0 , 261.0 , 203.0 , 110.0 , 101.0 , 6.0 , 52.0 , 34.0 ,
24.0 , 6.1 , 6.0 ,
// Np -------------------------------------------------------------
118678.0 , 22426.0 , 21600.0 , 17610.0 , 5723.0 , 5366.0 , 4440.0 , 3854.0 ,
3669.0 , 1504.0 , 1331.0 , 1089.0 , 819.0 , 774.0 , 421.0 , 410.0 ,
346.0 , 274.0 , 211.0 , 116.0 , 106.0 , 6.0 , 54.0 , 35.0 ,
25.0 , 6.0 , 6.0 ,
// Pu -------------------------------------------------------------
121818.0 , 23097.0 , 22266.0 , 18056.0 , 5933.0 , 5541.0 , 4557.0 , 3977.0 ,
3783.0 , 1563.0 , 1384.0 , 1128.0 , 853.0 , 805.0 , 446.0 , 434.0 ,
356.0 , 287.0 , 219.0 , 122.0 , 111.0 , 6.0 , 53.0 , 34.0 ,
23.0 , 6.0 ,
// Am -------------------------------------------------------------
125027.0 , 23773.0 , 22944.0 , 18504.0 , 6121.0 , 5710.0 , 4667.0 , 4102.0 ,
3898.0 , 1623.0 , 1439.0 , 1167.0 , 887.0 , 836.0 , 467.0 , 452.0 ,
355.0 , 301.0 , 220.0 , 123.0 , 112.0 , 6.0 , 54.0 , 44.0 ,
36.0 , 6.0 ,
// Cm -------------------------------------------------------------
128220.0 , 24460.0 , 23779.0 , 18930.0 , 6288.0 , 5895.0 , 4797.0 , 4236.0 ,
4014.0 , 1664.0 , 1493.0 , 1194.0 , 919.0 , 864.0 , 494.0 , 479.0 ,
384.0 , 314.0 , 239.0 , 126.0 , 119.0 , 11.0 , 60.0 , 39.0 ,
27.0 , 5.0 , 6.0 ,
// Bk -------------------------------------------------------------
131590.0 , 25275.0 , 24385.0 , 19452.0 , 6556.0 , 6147.0 , 4977.0 , 4366.0 ,
4133.0 , 1729.0 , 1554.0 , 1236.0 , 955.0 , 898.0 , 520.0 , 504.0 ,
401.0 , 329.0 , 248.0 , 142.0 , 124.0 , 12.0 , 63.0 , 41.0 ,
27.0 , 4.0 , 6.0 ,
// Cf -------------------------------------------------------------
135960.0 , 26110.0 , 25250.0 , 19930.0 , 6754.0 , 6359.0 , 5109.0 , 4492.0 ,
4247.0 , 1789.0 , 1610.0 , 1273.0 , 987.0 , 925.0 , 546.0 , 529.0 ,
412.0 , 338.0 , 251.0 , 142.0 , 129.0 , 9.0 , 61.0 , 39.0 ,
25.0 , 6.0 ,
// Es -------------------------------------------------------------
139490.0 , 26900.0 , 26020.0 , 20410.0 , 6977.0 , 6754.0 , 5252.0 , 4630.0 ,
4369.0 , 1857.0 , 1674.0 , 1316.0 , 1024.0 , 959.0 , 573.0 , 554.0 ,
429.0 , 353.0 , 260.0 , 148.0 , 135.0 , 9.0 , 63.0 , 40.0 ,
25.0 , 6.0 ,
// Fm -------------------------------------------------------------
143090.0 , 27700.0 , 26810.0 , 20900.0 , 7205.0 , 6793.0 , 5397.0 , 4766.0 ,
4498.0 , 1933.0 , 1746.0 , 1366.0 , 1068.0 , 1000.0 , 606.0 , 587.0 ,
453.0 , 375.0 , 275.0 , 160.0 , 145.0 , 15.0 , 69.0 , 45.0 ,
29.0 , 7.0 ,
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int
G4AtomicShells::GetNumberOfShells(G4int Z)
{
return fNumberOfShells[Z];
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4double
G4AtomicShells::GetBindingEnergy(G4int Z, G4int ShellNb)
{
assert (Z>=1 && Z<=101 && ShellNb<fNumberOfShells[Z]);
G4int indice = 1;
for (G4int z = 1 ; z < Z ; z++) indice += fNumberOfShells[z];
indice += ShellNb;
return fBindingEnergies[indice]*eV;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
+296
View File
@@ -0,0 +1,296 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4Element.cc,v 2.7 1998/11/16 17:26:46 maire Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// ------------ class G4Element ------------
//
// Torre Wenaus, November 1995
//
//
// 26-06-96, Code uses operators (+=, *=, ++, -> etc.) correctly, P. Urban
// 09-07-96, new data members added by L.Urban
// 17-01-97, aesthetic rearrangement, M.Maire
// 20-01-97, Compute Tsai's formula for the rad length, M.Maire
// 21-01-97, remove mixture flag, M.Maire
// 24-01-97, ComputeIonisationParameters().
// new data member: fTaul, M.Maire
// 29-01-97, Forbidden to create Element with Z<1 or N<Z, M.Maire
// 20-03-97, corrected initialization of pointers, M.Maire
// 28-04-98, atomic subshell binding energies stuff, V. Grichine
// 09-07-98, Ionisation parameters removed from the class, M.Maire
// 16-11-98, name Subshell -> Shell; GetBindingEnergy(), mma
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#include "G4Element.hh"
#include <iomanip.h>
G4ElementTable G4Element::theElementTable;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// Constructor to Generate an element from scratch
G4Element::G4Element(const G4String& name, const G4String& symbol,
G4double zeff, G4double aeff)
{
if (zeff<1.) G4Exception
(" ERROR! It is not allowed to create an Element with Z < 1" );
if (aeff/(g/mole)<zeff) G4Exception
(" ERROR! Attempt to create an Element with N < Z !!!" );
if ((zeff-G4int(zeff)) > perMillion)
G4cerr << name <<
" : WARNING ! Trying to define an element as a mixture directly via effective Z."
<< endl;
InitializePointers();
fName = name;
fSymbol = symbol;
fZeff = zeff;
fNeff = aeff/(g/mole);
fAeff = aeff;
fNumberOfIsotopes = 0;
fNbOfAtomicShells = G4AtomicShells::GetNumberOfShells((G4int)fZeff);
fAtomicShells = new G4double[fNbOfAtomicShells];
for (G4int i=0;i<fNbOfAtomicShells;i++)
fAtomicShells[i] = G4AtomicShells::GetBindingEnergy((G4int)fZeff,i);
ComputeDerivedQuantities();
// Store in table and set the index
theElementTable.insert(this);
fIndexInTable = theElementTable.index(this);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// Constructor to Generate element from a List of 'nIsotopes' isotopes, added
// via AddIsotope
G4Element::G4Element(const G4String& name, const G4String& symbol, G4int nIsotopes)
{
InitializePointers();
size_t n = size_t(nIsotopes);
fName = name;
fSymbol = symbol;
fNumberOfIsotopes = 0;
theIsotopeVector = new G4IsotopeVector(n);
fRelativeAbundanceVector = new G4double[nIsotopes];
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// Add an isotope to the element
void G4Element::AddIsotope(G4Isotope* isotope, G4double abundance)
{
if (theIsotopeVector == NULL)
G4Exception("ERROR!!! - Trying to add an Isotope before contructing the element.");
// filling ...
if ( fNumberOfIsotopes < theIsotopeVector->length() ) {
fRelativeAbundanceVector[fNumberOfIsotopes] = abundance;
(*theIsotopeVector)(fNumberOfIsotopes) = isotope;
fNumberOfIsotopes ++;
}
else
G4Exception
("ERROR!!! - Attempt to add more than the declared number of constituent isotopes.");
// filled.
if ( fNumberOfIsotopes == theIsotopeVector->length() ) {
// Compute Zeff, Neff, Aeff
G4int i;
G4double wtSum=0.0;
fZeff = G4double( (*theIsotopeVector)(0)->GetZ() );
fNeff = fAeff = 0.0;
for (i=0;i<fNumberOfIsotopes;i++) {
fNeff += fRelativeAbundanceVector[i]*(*theIsotopeVector)(i)->GetN();
fAeff += fRelativeAbundanceVector[i]*(*theIsotopeVector)(i)->GetA();
wtSum += fRelativeAbundanceVector[i];
}
fNeff /= wtSum;
fAeff /= wtSum;
fNbOfAtomicShells = G4AtomicShells::GetNumberOfShells((G4int)fZeff);
fAtomicShells = new G4double[fNbOfAtomicShells];
for (i=0;i<fNbOfAtomicShells;i++)
fAtomicShells[i] = G4AtomicShells::GetBindingEnergy((G4int)fZeff,i);
ComputeDerivedQuantities();
// Store in table and set the index
theElementTable.insert(this);
fIndexInTable = theElementTable.index(this);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4Element::InitializePointers()
{
theIsotopeVector = NULL;
fRelativeAbundanceVector = NULL;
fAtomicShells = NULL;
fIonisation = NULL;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4Element::~G4Element()
{
if (theIsotopeVector) delete theIsotopeVector;
if (fRelativeAbundanceVector) delete [] fRelativeAbundanceVector;
if (fAtomicShells) delete [] fAtomicShells;
if (fIonisation) delete fIonisation;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4Element::G4Element(G4Element &right)
{
*this = right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
const G4Element & G4Element::operator=(const G4Element &right)
{
return right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4Element::operator==(const G4Element &right) const
{
return (this == (G4Element *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4Element::operator!=(const G4Element &right) const
{
return (this != (G4Element *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4Element::ComputeDerivedQuantities()
{
// some basic functions of the atomic number
// Radiation Length
ComputeCoulombFactor();
ComputeLradTsaiFactor();
// parameters for energy loss by ionisation
fIonisation = new G4IonisParamElm(fZeff);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4Element::ComputeCoulombFactor()
{
//
// Compute Coulomb correction factor (Phys Rev. D50 3-1 (1994) page 1254)
const G4double k1 = 0.0083 , k2 = 0.20206 ,k3 = 0.0020 , k4 = 0.0369 ;
G4double az2 = (fine_structure_const*fZeff)*(fine_structure_const*fZeff);
G4double az4 = az2 * az2;
fCoulomb = (k1*az4 + k2 + 1./(1.+az2))*az2 - (k3*az4 + k4)*az4;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4Element::ComputeLradTsaiFactor()
{
//
// Compute Tsai's Expression for the Radiation Length
// (Phys Rev. D50 3-1 (1994) page 1254)
const G4double Lrad_light[] = {5.31 , 4.79 , 4.74 , 4.71} ;
const G4double Lprad_light[] = {6.144 , 5.621 , 5.805 , 5.924} ;
const G4double logZ3 = log(fZeff)/3.;
G4double Lrad, Lprad;
G4int iz = (int)(fZeff+0.5) - 1 ;
if (iz <= 3) { Lrad = Lrad_light[iz] ; Lprad = Lprad_light[iz] ; }
else { Lrad = log(184.15) - logZ3 ; Lprad = log(1194.) - 2*logZ3 ; }
fRadTsai = 4*alpha_rcl2*fZeff*(fZeff*(Lrad-fCoulomb) + Lprad);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4double G4Element::GetAtomicShell(G4int i) const
{
if (i<0 || i>=fNbOfAtomicShells)
G4Exception("Invalid argument in G4Element::GetAtomicShell");
return fAtomicShells[i];
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4Element* element)
{
long mode = flux.setf(ios::fixed,ios::floatfield);
flux
<< " Element: " << setw(8) << element->fName << setw(3) << element->fSymbol
<< " Z = " << setw(4) << setprecision(1) << element->fZeff
<< " N = " << setw(5) << setprecision(1) << element->fNeff
<< " A = " << setw(6) << setprecision(2) << (element->fAeff)/(g/mole)
<< " g/mole";
for (G4int i=0; i<element->fNumberOfIsotopes; i++)
flux
<< "\n ---> " << (*(element->theIsotopeVector))[i]
<< " abundance: " << setw(6) << setprecision(2)
<< (element->fRelativeAbundanceVector[i])/perCent << " %";
flux.setf(mode,ios::floatfield);
return flux;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4Element& element)
{
flux << &element;
return flux;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4ElementTable ElementTable)
{
//Dump info for all known elements
flux << "\n***** Table : Nb of elements = " << ElementTable.length()
<< " *****\n" << endl;
for (G4int i=0; i<ElementTable.length(); i++) flux << ElementTable[i]
<< endl << endl;
return flux;
}
+92
View File
@@ -0,0 +1,92 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4IonisParamElm.cc,v 2.2 1998/07/12 03:00:39 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// ------------ class G4IonisParamElm ------------
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
//
// 09-07-98, data moved from G4Element. M.Maire
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#include "G4IonisParamElm.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4IonisParamElm::G4IonisParamElm(G4double Z)
{
if (Z < 1.) G4Exception
(" ERROR! It is not allowed to create an Element with Z < 1" );
// some basic functions of the atomic number
fZ = Z;
fZ3 = pow(fZ, 1./3.);
fZZ3 = pow(fZ*(fZ+1.), 1./3.);
flogZ3 = log(fZ)/3.;
// parameters for energy loss by ionisation
fMeanExcitationEnergy = 16.*pow(fZ,0.9)*eV;
fTau0 = 0.1*fZ3*MeV/proton_mass_c2;
fTaul = 2.*MeV/proton_mass_c2;
// compute the Bethe-Bloch formula for energy = fTaul*particle mass
G4double rate = fMeanExcitationEnergy/electron_mass_c2 ;
G4double w = fTaul*(fTaul+2.) ;
fBetheBlochLow = (fTaul+1.)*(fTaul+1.)*log(2.*w/rate)/w - 1. ;
fBetheBlochLow = 2.*fZ*twopi_mc2_rcl2*fBetheBlochLow ;
fClow = sqrt(fTaul)*fBetheBlochLow;
fAlow = 6.458040 * fClow/fTau0;
G4double Taum = 0.035*fZ3*MeV/proton_mass_c2;
fBlow =-3.229020*fClow/(fTau0*sqrt(Taum));
// Shell correction factors
fShellCorrectionVector = new G4double[3];
G4double rate2 = rate*rate;
fShellCorrectionVector[0] = ( 1.10289e5 + 5.14781e8*rate)*rate2 ;
fShellCorrectionVector[1] = ( 7.93805e3 - 2.22565e7*rate)*rate2 ;
fShellCorrectionVector[2] = (-9.92256e1 + 2.10823e5*rate)*rate2 ;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4IonisParamElm::~G4IonisParamElm()
{ }
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4IonisParamElm::G4IonisParamElm(G4IonisParamElm &right)
{
*this = right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
const G4IonisParamElm & G4IonisParamElm::operator=(const G4IonisParamElm &right)
{
return right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4IonisParamElm::operator==(const G4IonisParamElm &right) const
{
return (this == (G4IonisParamElm *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4IonisParamElm::operator!=(const G4IonisParamElm &right) const
{
return (this != (G4IonisParamElm *) &right);
}
+210
View File
@@ -0,0 +1,210 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4IonisParamMat.cc,v 2.5 1998/10/05 14:33:14 maire Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// 18-07-98, bug corrected in ComputeDensityEffect() for gas
// 09-07-98, data moved from G4Material, M.Maire
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#include "G4IonisParamMat.hh"
#include "G4Material.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4IonisParamMat::G4IonisParamMat(G4Material* material)
:fMaterial(material)
{
ComputeMeanParameters();
ComputeDensityEffect();
ComputeFluctModel();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4IonisParamMat::ComputeMeanParameters()
{
// compute mean excitation energy and shell correction vector
fTaul = (*(fMaterial->GetElementVector()))[0]->GetIonisation()->GetTaul();
fLogMeanExcEnergy = 0.;
for (G4int i=0; i < fMaterial->GetNumberOfElements(); i++)
fLogMeanExcEnergy += (fMaterial->GetVecNbOfAtomsPerVolume())[i]
*((*(fMaterial->GetElementVector()))[i]->GetZ())
*log((*(fMaterial->GetElementVector()))[i]->GetIonisation()
->GetMeanExcitationEnergy());
fLogMeanExcEnergy /= fMaterial->GetTotNbOfElectPerVolume();
fMeanExcitationEnergy = exp(fLogMeanExcEnergy);
fShellCorrectionVector = new G4double[3];
for (G4int j=0; j<=2; j++)
{
fShellCorrectionVector[j] = 0.;
for (G4int k=0; k<fMaterial->GetNumberOfElements(); k++)
fShellCorrectionVector[j] += (fMaterial->GetVecNbOfAtomsPerVolume())[k]
*((*(fMaterial->GetElementVector()))[k]->GetIonisation()
->GetShellCorrectionVector()[j]);
fShellCorrectionVector[j] /= fMaterial->GetTotNbOfElectPerVolume();
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4IonisParamMat::ComputeDensityEffect()
{
// Compute parameters for the density effect correction in DE/Dx formula.
// The parametrization is from R.M. Sternheimer, Phys. Rev.B,3:3681 (1971)
const G4double Cd2 = 4*pi*hbarc_squared*classic_electr_radius;
const G4double twoln10 = 2.*log(10.);
G4int icase;
fCdensity = 1. + log(fMeanExcitationEnergy*fMeanExcitationEnergy
/(Cd2*fMaterial->GetTotNbOfElectPerVolume()));
//
// condensed materials
//
G4State State = fMaterial->GetState();
if ((State == kStateSolid)||(State == kStateLiquid)) {
const G4double E100keV = 100.*keV;
const G4double ClimiS[] = {3.681 , 5.215 };
const G4double X0valS[] = {1.0 , 1.5 };
const G4double X1valS[] = {2.0 , 3.0 };
if(fMeanExcitationEnergy < E100keV) icase = 0 ;
else icase = 1 ;
if(fCdensity < ClimiS[icase]) fX0density = 0.2;
else fX0density = 0.326*fCdensity-X0valS[icase];
fX1density = X1valS[icase] ; fMdensity = 3.0;
//special: Hydrogen
if ((fMaterial->GetNumberOfElements()==1)&&(fMaterial->GetZ()==1.)) {
fX0density = 0.425; fX1density = 2.0; fMdensity = 5.949;
}
}
//
// gases
//
if (State == kStateGas) {
const G4double ClimiG[] = { 10. , 10.5 , 11. , 11.5 , 12.25 , 13.804};
const G4double X0valG[] = { 1.6 , 1.7 , 1.8 , 1.9 , 2.0 , 2.0 };
const G4double X1valG[] = { 4.0 , 4.0 , 4.0 , 4.0 , 4.0 , 5.0 };
icase = 5;
fX0density = 0.326*fCdensity-2.5 ; fX1density = 5.0 ; fMdensity = 3. ;
while((icase > 0)&&(fCdensity < ClimiG[icase])) icase-- ;
fX0density = X0valG[icase] ; fX1density = X1valG[icase] ;
//special: Hydrogen
if ((fMaterial->GetNumberOfElements()==1)&&(fMaterial->GetZ()==1.)) {
fX0density = 1.837; fX1density = 3.0; fMdensity = 4.754;
}
//special: Helium
if ((fMaterial->GetNumberOfElements()==1)&&(fMaterial->GetZ()==2.)) {
fX0density = 2.191; fX1density = 3.0; fMdensity = 3.297;
}
// change parameters if the gas is not in STP.
// For the correction the density(STP) is needed. Density(STP) is calculated here :
G4double Density = fMaterial->GetDensity();
G4double Pressure = fMaterial->GetPressure();
G4double Temp = fMaterial->GetTemperature();
G4double DensitySTP = Density*STP_Pressure*Temp/(Pressure*STP_Temperature);
G4double ParCorr = log(Density/DensitySTP) ;
fCdensity -= ParCorr;
fX0density -= ParCorr/twoln10 ;
fX1density -= ParCorr/twoln10 ;
}
G4double Xa = fCdensity/twoln10 ;
fAdensity = twoln10*(Xa-fX0density)
/pow((fX1density-fX0density),fMdensity);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4IonisParamMat::ComputeFluctModel()
{
// compute parameters for the energy loss fluctuation model
// need an 'effective Z' ?????
G4double Zeff = 0.;
for (G4int i=0;i<fMaterial->GetNumberOfElements();i++)
Zeff += (fMaterial->GetFractionVector())[i]
*((*(fMaterial->GetElementVector()))[i]->GetZ());
if (Zeff > 2.) fF2fluct = 2./Zeff ;
else fF2fluct = 0.;
fF1fluct = 1. - fF2fluct;
fEnergy2fluct = 10.*Zeff*Zeff*eV;
fLogEnergy2fluct = log(fEnergy2fluct);
fLogEnergy1fluct = (fLogMeanExcEnergy - fF2fluct*fLogEnergy2fluct)
/fF1fluct;
fEnergy1fluct = exp(fLogEnergy1fluct);
fEnergy0fluct = 10.*eV;
fRateionexcfluct = 0.4;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4IonisParamMat::~G4IonisParamMat()
{ }
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4IonisParamMat::G4IonisParamMat(const G4IonisParamMat &right)
{
*this = right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
const G4IonisParamMat & G4IonisParamMat::operator=(const G4IonisParamMat &right)
{
return right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4IonisParamMat::operator==(const G4IonisParamMat &right) const
{
return (this == (G4IonisParamMat *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4IonisParamMat::operator!=(const G4IonisParamMat &right) const
{
return (this != (G4IonisParamMat *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
+128
View File
@@ -0,0 +1,128 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4Isotope.cc,v 2.2 1998/07/12 03:00:41 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// --------------------------------------------------------------
// GEANT 4 class implementation file
//
// For information related to this code contact:
// CERN, CN Division, ASD Group
//
// ---------- class G4Isotope ---------
//
// Torre Wenaus, November 1995
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// 26-06-96, Code uses operators (+=, *=, ++, -> etc.) correctly, P. Urban
// 29-01-97, Forbidden to create Isotope with Z<1 or N<Z, M.Maire
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#include "G4Isotope.hh"
#include <iomanip.h>
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4IsotopeTable G4Isotope::theIsotopeTable;
// Create an isotope
G4Isotope::G4Isotope(const G4String& Name, G4int Z, G4int N, G4double A)
: fName(Name), fZ(Z), fN(N), fA(A)
{
if (Z<1) G4Exception
(" ERROR! It is not allowed to create an Isotope with Z < 1" );
if (N<Z) G4Exception
(" ERROR! Attempt to create an Isotope with N < Z !!!" );
theIsotopeTable.insert(this);
fIndexInTable = theIsotopeTable.index(this);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4Isotope::~G4Isotope() {}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4Isotope::G4Isotope(G4Isotope &right)
{
*this = right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4Isotope & G4Isotope::operator=(const G4Isotope &right)
{
if (this != &right)
{
fName = right.fName;
fZ = right.fZ;
fN = right.fZ;
fA = right.fA;
theIsotopeTable = right.theIsotopeTable;
fIndexInTable = right.fIndexInTable;
}
return *this;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4Isotope::operator==(const G4Isotope &right) const
{
return (this == (G4Isotope *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4Isotope::operator!=(const G4Isotope &right) const
{
return (this != (G4Isotope *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4Isotope* isotope)
{
long mode = flux.setf(ios::fixed,ios::floatfield);
flux
<< " Isotope: " << setw(5) << isotope->fName
<< " Z = " << setw(2) << isotope->fZ
<< " N = " << setw(3) << isotope->fN
<< " A = " << setw(6) << setprecision(2)
<< (isotope->fA)/(g/mole) << " g/mole";
flux.setf(mode,ios::floatfield);
return flux;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4Isotope& isotope)
{
flux << &isotope;
return flux;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4IsotopeTable IsotopeTable)
{
//Dump info for all known isotopes
flux
<< "\n***** Table : Nb of isotopes = " << IsotopeTable.length()
<< " *****\n" << endl;
for (G4int i=0; i<IsotopeTable.length(); i++) flux << IsotopeTable[i] << endl;
return flux;
}
+107
View File
@@ -0,0 +1,107 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4MPVEntry.cc,v 2.1 1998/07/13 17:14:08 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
////////////////////////////////////////////////////////////////////////
// G4MPVEntry Class Implementation
////////////////////////////////////////////////////////////////////////
//
// File: G4MPVEntry.cc
// Version: 1.0
// Created: 1996-02-08
// Author: Juliet Armstrong
// Updated: 1997-03-25 by Peter Gumplinger
// > cosmetics (only)
// mail: gum@triumf.ca
//
////////////////////////////////////////////////////////////////////////
#include "G4MPVEntry.hh"
/////////////////////////
// Class Implementation
/////////////////////////
//////////////
// Operators
//////////////
// Overload the == operator
// ------------------------
// Well defined == semantics required by RWTPtrSortedVector
//
G4bool G4MPVEntry::operator ==(const G4MPVEntry &right) const
{
if (thePhotonMomentum == right.thePhotonMomentum)
return true;
else
return false;
}
// Overload the < operator
// -----------------------
// Well defined < semantics required by RWTPtrSortedVector
//
G4bool G4MPVEntry::operator <(const G4MPVEntry &right) const
{
if (thePhotonMomentum < right.thePhotonMomentum)
return true;
else
return false;
}
// Overload the = operator
// -----------------------
// Well defined = semantics required by RWTPtrSortedVector
//
G4MPVEntry& G4MPVEntry::operator =(const G4MPVEntry &right)
{
thePhotonMomentum = right.thePhotonMomentum;
theProperty = right.theProperty;
return *this;
}
/////////////////
// Constructors
/////////////////
G4MPVEntry::G4MPVEntry(G4double aPhotonMomentum, G4double aProperty)
{
thePhotonMomentum = aPhotonMomentum;
theProperty = aProperty;
}
G4MPVEntry::G4MPVEntry(const G4MPVEntry &right)
{
thePhotonMomentum = right.thePhotonMomentum;
theProperty = right.theProperty;
}
////////////////
// Destructors
////////////////
G4MPVEntry::~G4MPVEntry(){}
////////////
// Methods
////////////
void G4MPVEntry::DumpEntry()
{
G4cout << "("
<< thePhotonMomentum
<< ", "
<< theProperty
<< ")"
<< endl;
}
+444
View File
@@ -0,0 +1,444 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4Material.cc,v 2.7 1998/11/20 15:49:24 maire Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// ---------- class G4Material ----------
//
// Torre Wenaus, November 1995
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
//
// 26-06-96, Code uses operators (+=, *=, ++, -> etc.) correctly, P. Urban
// 10-07-96, new data members added by L.Urban
// 12-12-96, new data members added by L.Urban
// 20-01-97, aesthetic rearrangement. RadLength calculation modified.
// Data members Zeff and Aeff REMOVED (i.e. passed to the Elements).
// (local definition of Zeff in DensityEffect and FluctModel...)
// Vacuum defined as a G4State. Mixture flag removed, M.Maire.
// 29-01-97, State=Vacuum automatically set density=0 in the contructors.
// Subsequent protections have been put in the calculation of
// MeanExcEnergy, ShellCorrectionVector, DensityEffect, M.Maire.
// 11-02-97, ComputeDensityEffect() rearranged, M.Maire.
// 20-03-97, corrected initialization of pointers, M.Maire.
// 28-05-98, the kState=kVacuum has been removed.
// automatic check for a minimal density, M.Maire
// 12-06-98, new method AddMaterial() allowing mixture of materials, M.Maire
// 09-07-98, ionisation parameters removed from the class, M.Maire
// 05-10-98, change names: NumDensity -> NbOfAtomsPerVolume
// 18-11-98, new interface to SandiaTable
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#include "G4Material.hh"
#include "G4UnitsTable.hh"
#include <iomanip.h>
G4MaterialTable G4Material::theMaterialTable;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// Constructor to create a material from scratch
G4Material::G4Material(const G4String& name, G4double z,
G4double a, G4double density,
G4State state, G4double temp, G4double pressure)
{
InitializePointers();
if (density < universe_mean_density)
{ G4cout << "--- Warning from G4Material::G4Material()"
<< " define a material with density=0 is not allowed. \n"
<< " The material " << name << " will be constructed with the"
<< " default minimal density: " << universe_mean_density/(g/cm3)
<< "g/cm3" << endl;
density = universe_mean_density;
}
fName = name;
fDensity = density;
fState = state;
fTemp = temp;
fPressure = pressure;
// Initialize theElementVector allocating one
// element corresponding to this material
maxNbComponents = fNumberOfComponents = fNumberOfElements = 1;
theElementVector = new G4ElementVector(1);
theElementVector[0] = new G4Element(name, " ", z, a);
fMassFractionVector = new G4double[1];
fMassFractionVector[0] = 1. ;
if (fState == kStateUndefined)
{
if (fDensity > kGasThreshold) fState = kStateSolid;
else fState = kStateGas;
}
ComputeDerivedQuantities();
// Store in the table of Materials
theMaterialTable.insert(this);
fIndexInTable = theMaterialTable.index(this);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// Constructor to create a material from a List of constituents
// (elements and/or materials) added with AddElement or AddMaterial
G4Material::G4Material(const G4String& name, G4double density, G4int nComponents,
G4State state, G4double temp, G4double pressure)
{
InitializePointers();
if (density < universe_mean_density)
{G4cout << "--- Warning from G4Material::G4Material()"
<< " define a material with density=0 is not allowed. \n"
<< " The material " << name << " will be constructed with the"
<< " default minimal density: " << universe_mean_density/(g/cm3)
<< "g/cm3" << endl;
density = universe_mean_density;
}
fName = name;
fDensity = density;
fState = state;
fTemp = temp;
fPressure = pressure;
maxNbComponents = nComponents;
fNumberOfComponents = fNumberOfElements = 0;
theElementVector = new G4ElementVector(maxNbComponents);
if (fState == kStateUndefined)
{
if (fDensity > kGasThreshold) fState = kStateSolid;
else fState = kStateGas;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// AddElement -- composition by atom count
void G4Material::AddElement(G4Element* element, G4int nAtoms)
{
// initialization
if ( fNumberOfElements == 0 ) {
fAtomsVector = new G4int [maxNbComponents];
fMassFractionVector = new G4double[maxNbComponents];
}
// filling ...
if ( fNumberOfElements < maxNbComponents ) {
(*theElementVector)[fNumberOfElements] = element;
fAtomsVector [fNumberOfElements] = nAtoms;
fNumberOfComponents = ++fNumberOfElements;
}
else
G4Exception
("ERROR!!! - Attempt to add more than the declared number of elements.");
// filled.
if ( fNumberOfElements == maxNbComponents ) {
// compute proportion by mass
G4int i=0;
G4double Zmol(0.), Amol(0.);
for (i=0;i<fNumberOfElements;i++) {
Zmol += fAtomsVector[i]*(*theElementVector)[i]->GetZ();
Amol += fAtomsVector[i]*(*theElementVector)[i]->GetA();
}
for (i=0;i<fNumberOfElements;i++) {
fMassFractionVector[i] = fAtomsVector[i]*(*theElementVector)[i]->GetA()/Amol;
}
ComputeDerivedQuantities();
// Store in the static Table of Materials
theMaterialTable.insert(this);
fIndexInTable = theMaterialTable.index(this);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// AddElement -- composition by fraction of mass
void G4Material::AddElement(G4Element* element, G4double fraction)
{
// if fAtomsVector is non-NULL, complain. Apples and oranges. $$$
if (fAtomsVector) {
G4cerr << "This material is already being defined via elements by"
<< "atoms." << endl;
G4Exception ("You are mixing apples and oranges ...");
}
// initialization
if (fNumberOfComponents == 0) {
fMassFractionVector = new G4double[100];
}
// filling ...
if (fNumberOfComponents < maxNbComponents) {
size_t el = 0;
while ((el<fNumberOfElements)&&(element!=(*theElementVector)[el])) el++;
if (el<fNumberOfElements) fMassFractionVector[el] += fraction;
else {
if(el>=theElementVector->length()) theElementVector->resize(el+1);
(*theElementVector)[el] = element;
fMassFractionVector[el] = fraction;
fNumberOfElements ++;
}
fNumberOfComponents++;
}
else
G4Exception
("ERROR!!! - Attempt to add more than the declared number of components.");
// filled.
if (fNumberOfComponents == maxNbComponents) {
// check sum of weights -- OK?
G4int i;
G4double wtSum(0.0);
for (i=0;i<fNumberOfElements;i++) { wtSum += fMassFractionVector[i]; }
if (abs(1.-wtSum) > perThousand) {
G4cerr << "WARNING !! - Fractional masses do not sum to 1 :the Delta is > 0.001"
<< "( the weights are NOT renormalized; the results may be wrong)"
<< endl;
}
ComputeDerivedQuantities();
// Store in the static Table of Materials
theMaterialTable.insert(this);
fIndexInTable = theMaterialTable.index(this);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
// AddMaterial -- composition by fraction of mass
void G4Material::AddMaterial(G4Material* material, G4double fraction)
{
// if fAtomsVector is non-NULL, complain. Apples and oranges. $$$
if (fAtomsVector) {
G4cerr << "This material is already being defined via elements by"
<< "atoms." << endl;
G4Exception ("You are mixing apples and oranges ...");
}
// initialization
if (fNumberOfComponents == 0) {
fMassFractionVector = new G4double[100];
}
// filling ...
if (fNumberOfComponents < maxNbComponents) {
for (G4int elm=0; elm < material->GetNumberOfElements(); elm++)
{ G4Element* element = (*(material->GetElementVector()))[elm];
size_t el = 0;
while ((el<fNumberOfElements)&&(element!=(*theElementVector)[el])) el++;
if (el<fNumberOfElements) fMassFractionVector[el] += fraction
*(material->GetFractionVector())[elm];
else {
if(el>=theElementVector->length()) theElementVector->resize(el+1);
(*theElementVector)[el] = element;
fMassFractionVector[el] = fraction*(material->GetFractionVector())[elm];
fNumberOfElements ++;
}
}
fNumberOfComponents++;
}
else
G4Exception
("ERROR!!! - Attempt to add more than the declared number of components.");
// filled.
if (fNumberOfComponents == maxNbComponents) {
// check sum of weights -- OK?
G4int i;
G4double wtSum(0.0);
for (i=0;i<fNumberOfElements;i++) { wtSum += fMassFractionVector[i]; }
if (abs(1.-wtSum) > perThousand) {
G4cerr << "WARNING !! - Fractional masses do not sum to 1 :the Delta is > 0.001"
<< "( the weights are NOT renormalized; the results may be wrong)"
<< endl;
}
ComputeDerivedQuantities();
// Store in the static Table of Materials
theMaterialTable.insert(this);
fIndexInTable = theMaterialTable.index(this);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4Material::ComputeDerivedQuantities()
{
// Header routine to compute various properties of material.
//
// Atoms density vector, Electrons density
G4double Zi, Ai;
TotNbOfAtomsPerVolume = 0.;
VecNbOfAtomsPerVolume = new G4double[fNumberOfElements];
TotNbOfElectPerVolume = 0.;
for (G4int i=0;i<fNumberOfElements;i++) {
Zi = (*theElementVector)[i]->GetZ();
Ai = (*theElementVector)[i]->GetA();
VecNbOfAtomsPerVolume[i] = Avogadro*fDensity*fMassFractionVector[i]/Ai;
TotNbOfAtomsPerVolume += VecNbOfAtomsPerVolume[i];
TotNbOfElectPerVolume += VecNbOfAtomsPerVolume[i]*Zi;
}
//for gas, check coherence of the state conditions
if (fState == kStateGas) {
G4double ratio = TotNbOfAtomsPerVolume*k_Boltzmann*fTemp/fPressure;
if ((ratio<0.5)||(ratio>2.)) {
G4cout << "---warning from G4Material-- The state conditions of the gas: "
<< fName << " are not consistent."
<< "\n density = " << fDensity/(mg/cm3) << " mg/cm3"
<< "\t pressure = " << fPressure/atmosphere << " atmosphere"
<< "\t temperature = " << fTemp/kelvin << " kelvin"
<< "\n rho*(T/P) would be of the order of: "
<< (fDensity/(TotNbOfAtomsPerVolume*k_Boltzmann))/((mg/cm3)*(kelvin/atmosphere))
<< " (mg/cm3)*(kelvin/atmosphere). The energy loss calculation maybe be affected \n";
}
}
ComputeRadiationLength();
fIonisation = new G4IonisParamMat(this);
fSandiaTable = new G4SandiaTable(this);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4Material::ComputeRadiationLength()
{
G4double radinv = 0.0 ;
for (G4int i=0;i<fNumberOfElements;i++) {
radinv += VecNbOfAtomsPerVolume[i]*((*theElementVector)[i]->GetfRadTsai());
}
fRadlen = (radinv <= 0.0 ? DBL_MAX : 1./radinv);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4Material::InitializePointers()
{
theElementVector = NULL;
fMassFractionVector = NULL;
fAtomsVector = NULL;
fMaterialPropertiesTable = NULL;
VecNbOfAtomsPerVolume = NULL;
fIonisation = NULL;
fSandiaTable = NULL;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4Material::~G4Material()
{
if (theElementVector) delete theElementVector;
if (fMassFractionVector) delete [] fMassFractionVector;
if (fAtomsVector) delete [] fAtomsVector;
if (VecNbOfAtomsPerVolume) delete [] VecNbOfAtomsPerVolume;
if (fIonisation) delete fIonisation;
if (fSandiaTable) delete fSandiaTable;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4Material::G4Material(const G4Material &right)
{
*this = right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
const G4Material & G4Material::operator=(const G4Material &right)
{
return right;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4Material::operator==(const G4Material &right) const
{
return (this == (G4Material *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4int G4Material::operator!=(const G4Material &right) const
{
return (this != (G4Material *) &right);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4Material* material)
{
long mode = flux.setf(ios::fixed,ios::floatfield);
flux
<< " Material: " << setw(8) << material->fName
<< " density: " << setw(6) << setprecision(3)
<< G4BestUnit(material->fDensity,"Volumic Mass")
<< " temperature: " << setw(6) << setprecision(2)
<< (material->fTemp)/kelvin << " K"
<< " pressure: " << setw(6) << setprecision(2)
<< (material->fPressure)/atmosphere << " atm"
<< " RadLength: " << setw(7) << setprecision(3)
<< G4BestUnit(material->fRadlen,"Length");
for (G4int i=0; i<material->fNumberOfElements; i++)
flux
<< "\n ---> " << (*(material->theElementVector))[i]
<< " fractionMass: " << setw(6)<< setprecision(2)
<< (material->fMassFractionVector[i])/perCent << " %"
<< " Abundance " << setw(6)<< setprecision(2)
<< 100*(material->VecNbOfAtomsPerVolume[i])/
(material->TotNbOfAtomsPerVolume)
<< " %";
flux.setf(mode,ios::floatfield);
return flux;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4Material& material)
{
flux << &material;
return flux;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
ostream& operator<<(ostream& flux, G4MaterialTable MaterialTable)
{
//Dump info for all known materials
flux << "\n***** Table : Nb of materials = " << MaterialTable.length()
<< " *****\n" << endl;
for (G4int i=0; i<MaterialTable.length(); i++) flux << MaterialTable[i]
<< endl << endl;
return flux;
}
@@ -0,0 +1,173 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4MaterialPropertiesTable.cc,v 2.1 1998/07/13 17:14:14 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
////////////////////////////////////////////////////////////////////////
// G4MaterialPropertiesTable Implementation
////////////////////////////////////////////////////////////////////////
//
// File: G4MaterialPropertiesTable.cc
// Version: 1.0
// Created: 1996-02-08
// Author: Juliet Armstrong
// Updated: 1997-03-26 by Peter Gumplinger
// > cosmetics (only)
// mail: gum@triumf.ca
//
////////////////////////////////////////////////////////////////////////
#include "G4MaterialPropertiesTable.hh"
unsigned hashString(const G4String &str) { return str.hash(); }
//////////////
// Operators
//////////////
G4MaterialPropertiesTable&
G4MaterialPropertiesTable::operator =(const G4MaterialPropertiesTable &right)
{
// clear any current contents of MPT
MPT.clearAndDestroy();
// want to make an actual copy -- not a shallow copy which is
// the default for RWTPrtHashDictionary's assignment operator
RWTPtrHashDictionary<G4String, G4MaterialPropertyVector>
rightMPT(right.MPT);
RWTPtrHashDictionaryIterator<G4String, G4MaterialPropertyVector>
rightIterator(rightMPT);
rightIterator.reset();
while (++rightIterator) {
G4MaterialPropertyVector *newProp =
new G4MaterialPropertyVector(*(rightIterator.value()));
RWCString *newKey =
new RWCString(*(rightIterator.key()));
MPT.insertKeyAndValue(newKey, newProp);
}
return *this;
}
/////////////////
// Constructors
/////////////////
G4MaterialPropertiesTable::G4MaterialPropertiesTable() : MPT(hashString),
MPTiterator(MPT) {}
G4MaterialPropertiesTable::G4MaterialPropertiesTable
(const G4MaterialPropertiesTable &right) :
MPT(hashString), MPTiterator(MPT)
{
// want to make an actual copy -- not a shallow copy which is
// the default for RWTPrtHashDictionary's assignment operator
RWTPtrHashDictionary<G4String, G4MaterialPropertyVector>
rightMPT(right.MPT);
RWTPtrHashDictionaryIterator<G4String, G4MaterialPropertyVector>
rightIterator(rightMPT);
rightIterator.reset();
while (++rightIterator) {
G4MaterialPropertyVector *newProp =
new G4MaterialPropertyVector(*(rightIterator.value()));
RWCString *newKey =
new RWCString(*(rightIterator.key()));
MPT.insertKeyAndValue(newKey, newProp);
}
}
////////////////
// Destructors
////////////////
G4MaterialPropertiesTable::~G4MaterialPropertiesTable()
{
MPT.clearAndDestroy();
}
////////////
// Methods
////////////
void G4MaterialPropertiesTable::AddProperty(char *key,
G4double *PhotonMomenta,
G4double *PropertyValues,
G4int NumEntries)
{
G4MaterialPropertyVector *mpv =
new G4MaterialPropertyVector(PhotonMomenta,
PropertyValues,
NumEntries);
G4String *newKey = new G4String(key);
MPT.insertKeyAndValue(newKey, mpv);
}
void G4MaterialPropertiesTable::AddProperty(char *key,
G4MaterialPropertyVector *mpv)
{
// Provides a way of adding a property to the Material Properties
// Table given an G4MaterialPropertyVector Reference and a key
G4String *theKey = new G4String(key);
MPT.insertKeyAndValue(theKey, mpv);
}
void G4MaterialPropertiesTable::RemoveProperty(char *key)
{
G4String target(key);
MPT.remove(&target);
}
G4MaterialPropertyVector* G4MaterialPropertiesTable::GetProperty(char *key)
{
G4String target(key);
return MPT.findValue(&target);
}
void G4MaterialPropertiesTable::AddEntry(char *key,
G4double aPhotonMomentum,
G4double aPropertyValue)
{
G4String target(key);
G4MaterialPropertyVector *targetVector=MPT.findValue(&target);
if (targetVector != NULL) {
targetVector->AddElement(aPhotonMomentum, aPropertyValue);
}
else {
G4Exception("G4MaterialPropertiesTable::AddEntry ==> "
"Material Property Vector not found.");
}
}
void G4MaterialPropertiesTable::RemoveEntry(char *key,
G4double aPhotonMomentum)
{
G4String target(key);
G4MaterialPropertyVector *targetVector=MPT.findValue(&target);
if (targetVector) {
targetVector->RemoveElement(aPhotonMomentum);
}
else {
G4Exception("G4MaterialPropertiesTable::AddEntry ==> "
"Material Property Vector not found.");
}
}
void G4MaterialPropertiesTable::DumpTable()
{
MPTiterator.reset();
while(++MPTiterator) {
G4cout << *MPTiterator.key() << endl;
MPTiterator.value()->DumpVector();
}
}
@@ -0,0 +1,384 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4MaterialPropertyVector.cc,v 2.2 1998/07/13 17:14:16 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
////////////////////////////////////////////////////////////////////////
// G4MaterialPropertyVector Class Implementation
////////////////////////////////////////////////////////////////////////
//
// File: G4MaterialPropertyVector.cc
// Version: 1.0
// Created: 1996-02-08
// Author: Juliet Armstrong
// Updated: 1997-03-25 by Peter Gumplinger
// > cosmetics (only)
// mail: gum@triumf.ca
//
////////////////////////////////////////////////////////////////////////
#include "G4MaterialPropertyVector.hh"
/////////////////////////
// Class Implementation
/////////////////////////
//////////////
// Operators
//////////////
// ++ operator
// -----------
//
G4bool G4MaterialPropertyVector::operator ++()
{
CurrentEntry++;
if (CurrentEntry < NumEntries) {
return true;
}
else {
return false;
}
}
// = operator
// ----------
//
G4MaterialPropertyVector&
G4MaterialPropertyVector::operator =(const G4MaterialPropertyVector &right)
{
// clear the vector of current contents
MPV.clearAndDestroy();
// create an actual copy (instead of the shallow copy that the
// assignment operator defaults to for RWTPtrSortedVector)
NumEntries = 0;
CurrentEntry = -1;
for (G4int i = 0 ; i < right.NumEntries; i++) {
G4MPVEntry *newElement = new G4MPVEntry(right.GetEntry(i));
MPV.insert(newElement);
NumEntries++;
}
return *this;
}
/////////////////
// Constructors
/////////////////
G4MaterialPropertyVector::G4MaterialPropertyVector(G4double *PhotonMomenta,
G4double *PropertyValues,
G4int NumElements)
{
NumEntries = 0;
CurrentEntry = -1;
// create a vector filling it with the values
// from PhotonMomenta[] and PropertyValues[]
for(G4int i = 0; i < NumElements; i++) {
AddElement(PhotonMomenta[i], PropertyValues[i]);
}
}
G4MaterialPropertyVector::G4MaterialPropertyVector
(const G4MaterialPropertyVector &right)
{
// create an actual copy (instead of the shallow copy that the
// assignment operator defaults to for RWTPtrSortedVector)
NumEntries = 0;
CurrentEntry = -1;
for (G4int i = 0 ; i < right.NumEntries; i++) {
G4MPVEntry *newElement = new G4MPVEntry(right.GetEntry(i));
MPV.insert(newElement);
NumEntries++;
}
}
////////////////
// Destructors
////////////////
G4MaterialPropertyVector::~G4MaterialPropertyVector()
{
MPV.clearAndDestroy();
}
////////////
// Methods
////////////
void G4MaterialPropertyVector::AddElement(G4double aPhotonMomentum,
G4double aPropertyValue)
{
G4MPVEntry *newElement;
newElement = new G4MPVEntry(aPhotonMomentum, aPropertyValue);
MPV.insert(newElement);
NumEntries++;
}
void G4MaterialPropertyVector::RemoveElement(G4double aPhotonMomentum)
{
G4MPVEntry *newElement;
G4MPVEntry *success;
newElement = new G4MPVEntry(aPhotonMomentum, DBL_MAX);
success = MPV.remove(newElement);
if(success == NULL)
{
G4Exception("G4MaterialPropertyVector::RemoveElement==>"
"element not found");
return;
}
NumEntries--;
}
G4double
G4MaterialPropertyVector::GetProperty(G4double aPhotonMomentum) const
{
G4MPVEntry *target, *temp;
G4int left, right;
G4double ratio1, ratio2, pmright, pmleft, InterpolatedValue;
/////////////////////////
// Establish table range
/////////////////////////
G4double PMmin = MPV.first()->GetPhotonMomentum();
G4double minProp = MPV.first()->GetProperty();
G4double PMmax = MPV.last()->GetPhotonMomentum();
G4double maxProp = MPV.last()->GetProperty();
///////////////////////////////////////////
// Does value fall outside range of table?
///////////////////////////////////////////
if (aPhotonMomentum < PMmin)
{
G4cout << "\nWarning: G4MaterialPropertyVector::GetProperty";
G4cout << "\n==> attempt to Retrieve Property below range"
<< endl;
return minProp;
}
if (aPhotonMomentum > PMmax)
{
G4cout << "\nWarning: G4MaterialPropertyVector::GetProperty";
G4cout << "\n==> attempt to Retrieve Property above range"
<< endl;
return maxProp;
}
target = new G4MPVEntry(aPhotonMomentum, 0.0);
temp = MPV.find(target);
if (temp != NULL) {
////////////////////////
// Return actual value
////////////////////////
G4double retval = temp->GetProperty();
delete target;
return retval;
}
else {
//////////////////////////////
// Return interpolated value
//////////////////////////////
GetAdjacentBins(aPhotonMomentum, &left, &right);
pmleft = MPV[left]->GetPhotonMomentum();
pmright = MPV[right]->GetPhotonMomentum();
ratio1 = (aPhotonMomentum-pmleft)/(pmright-pmleft);
ratio2 = 1 - ratio1;
InterpolatedValue = MPV[left]->GetProperty()*ratio2 +
MPV[right]->GetProperty()*ratio1;
delete target;
return InterpolatedValue;
}
}
G4double G4MaterialPropertyVector::GetProperty() const
{
// For use with G4MaterialPropertyVector iterator
if(CurrentEntry == -1 || CurrentEntry >= NumEntries) {
G4Exception("G4MaterialPropertyVector::GetProperty ==>"
"Iterator attempted to Retrieve Property out of range");
return DBL_MAX;
}
else {
return MPV[CurrentEntry]->GetProperty();
}
}
G4double G4MaterialPropertyVector::GetPhotonMomentum() const
{
// For use with G4MaterialPropertyVector iterator
if(CurrentEntry == -1 || CurrentEntry >= NumEntries) {
G4Exception("G4MaterialPropertyVector::GetPhotonMomentum ==>"
"Iterator attempted to Retrieve Photon Momentum out of range");
return DBL_MAX;
}
else {
return MPV[CurrentEntry]->GetPhotonMomentum();
}
}
G4double
G4MaterialPropertyVector::GetPhotonMomentum(G4double aProperty) const
{
// ***NB***
// Assumes that the property is an increasing function of photon momentum (e.g.
// refraction index)
// ***NB***
//
// Returns the photon momentum corresponding to the property value passed in.
// If several photon momentum values correspond to the value passed in, the
// function returns the first photon momentum in the vector that corresponds
// to that value.
G4int left, right, mid;
G4double ratio1, ratio2, pright, pleft, InterpolatedValue;
//////////////////////////
// Establish Table range
//////////////////////////
G4double PropMin = MPV.first()->GetProperty();
G4double PMmin= MPV.first()->GetPhotonMomentum();
G4double PropMax = MPV.last()->GetProperty();
G4double PMmax= MPV.last()->GetPhotonMomentum();
///////////////////////////////////////////
// Does value fall outside range of table?
///////////////////////////////////////////
if (aProperty < PropMin)
{
G4cout << "\nWarning: G4MaterialPropertyVector::GetPhotonMomentum";
G4cout << "\n==> attempt to Retrieve Photon Momentum out of range"
<< endl;
return PMmin;
}
if (aProperty > PropMax) {
G4cout << "\nWarning: G4MaterialPropertyVector::GetPhotonMomentum";
G4cout << "\n==> attempt to Retrieve Photon Momentum out of range"
<< endl;
return PMmax;
}
//////////////////////////////
// Return interpolated value
//////////////////////////////
left = 0;
right = MPV.entries();
// find values in bins on either side of aProperty
do {
mid = (left + right)/2;
if (MPV[mid]->GetProperty() == aProperty) {
// Get first photon momentum value in vector that
// corresponds to property value
while (mid-1 >= 0 &&
MPV[mid-1]->GetProperty() == aProperty) {
mid--;
}
InterpolatedValue = MPV[mid]->GetPhotonMomentum();
goto end_GetPhotonMomentum;
}
if (MPV[mid]->GetProperty() < aProperty)
left = mid;
else
right = mid;
} while ((right - left) > 1);
pleft = MPV[left]->GetProperty();
pright = MPV[right]->GetProperty();
ratio1 = (aProperty - pleft) / (pright - pleft);
ratio2 = 1 - ratio1;
InterpolatedValue = MPV[left]->GetPhotonMomentum()*ratio2 +
MPV[right]->GetPhotonMomentum()*ratio1;
end_GetPhotonMomentum:
return InterpolatedValue;
}
void G4MaterialPropertyVector::ResetIterator()
{
CurrentEntry = -1;
}
void G4MaterialPropertyVector::DumpVector()
{
if (MPV.isEmpty()) {
G4cerr << "nothing to dump" << endl;
G4Exception("G4MaterialPropertyVector::DumpVector ==>"
"Nothing to dump! Vector is empty");
}
for (G4int i = 0; i < NumEntries; i++) {
G4cout << "MPV["<< i << "]: ";
MPV[i]->DumpEntry();
G4cout << i << NumEntries << endl;
}
G4cout << " Done DumpVector " << endl;
}
G4MPVEntry G4MaterialPropertyVector::GetEntry(G4int i) const
{
return *MPV[i];
}
void
G4MaterialPropertyVector::GetAdjacentBins(G4double aPhotonMomentum,
G4int *left,
G4int *right) const
{
G4int mid;
*left = 0;
*right = (MPV.entries() - 1);
// find values in bins on either side of aPhotonMomentum
do {
mid = (*left + *right)/2;
if (MPV[mid]->GetPhotonMomentum() < aPhotonMomentum)
{
*left = mid;
}
else
{
*right = mid;
}
} while ((*right - *left) > 1);
}
+113
View File
@@ -0,0 +1,113 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4OpticalSurface.cc,v 2.1 1998/07/13 17:14:17 urbi Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
////////////////////////////////////////////////////////////////////////
// Optical Surface Class Implementation
////////////////////////////////////////////////////////////////////////
//
// File: G4OpticalSurface.cc
// Description: An optical surface class for use in G4OpBoundaryProcess
// Version: 2.0
// Created: 1997-06-26
// Author: Peter Gumplinger
// mail: gum@triumf.ca
//
// Cvs version:
////////////////////////////////////////////////////////////////////////
#include "G4ios.hh"
#include "G4OpticalSurface.hh"
/////////////////////////
// Class Implementation
/////////////////////////
//////////////
// Operators
//////////////
const G4OpticalSurface &
G4OpticalSurface::operator=(const G4OpticalSurface &right)
{
return right;
}
/////////////////
// Constructors
/////////////////
G4OpticalSurface::G4OpticalSurface(const G4String& name,
G4OpticalSurfaceModel model,
G4OpticalSurfaceFinish finish,
G4OpticalSurfaceType type,
G4double value)
: theName(name),
theModel(model),
theFinish(finish),
theType(type),
theMaterialPropertiesTable(NULL)
{
if (model == glisur ){
polish = value;
sigma_alpha = 0.0;
}
else if ( model == unified ) {
sigma_alpha = value;
polish = 0.0;
}
else {
G4Exception("G4OpticalSurface::G4OpticalSurface ==> "
"Constructor called with INVALID model.");
}
}
G4OpticalSurface::G4OpticalSurface(const G4OpticalSurface &right)
{
*this = right;
}
G4OpticalSurface::~G4OpticalSurface(){}
G4int G4OpticalSurface::operator==(const G4OpticalSurface &right) const
{
return (this == (G4OpticalSurface *) &right);
}
G4int G4OpticalSurface::operator!=(const G4OpticalSurface &right) const
{
return (this != (G4OpticalSurface *) &right);
}
////////////
// Methods
////////////
void G4OpticalSurface::DumpInfo() const
{
// Dump info for surface
G4cout <<
" Surface type = " << theType << endl <<
" Surface finish = " << theFinish << endl <<
" Surface model = " << theModel << endl;
G4cout << endl;
G4cout << " Surface parameter " << endl;
G4cout << " ----------------- " << endl;
if (theModel == glisur ){
G4cout << polish << endl;
}
else {
G4cout << sigma_alpha << endl;
}
G4cout << endl;
}
+125
View File
@@ -0,0 +1,125 @@
// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4SandiaTable.cc,v 2.3 1998/12/08 15:12:29 maire Exp $
// GEANT4 tag $Name: geant4-00 $
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
//
// 18.11.98 simplified public interface; new methods for materials. mma
// 10.06.97 created. V. Grichine
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
#include "G4SandiaTable.hh"
#include "G4StaticSandiaData.hh"
#include "G4Material.hh"
G4int G4SandiaTable::fCumulInterval[101];
G4double G4SandiaTable::fSandiaCofPerAtom[4];
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4SandiaTable::G4SandiaTable(G4Material* material)
:fMaterial(material)
{
//build the CumulInterval array
fCumulInterval[0] = 1;
for (G4int Z=1; Z<101; Z++)
fCumulInterval[Z] = fCumulInterval[Z-1] + fNbOfIntervals[Z];
//compute macroscopic Sandia coefs for a material
ComputeMatSandiaMatrix();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4SandiaTable::~G4SandiaTable()
{ delete fMatSandiaMatrix;}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
void G4SandiaTable::ComputeMatSandiaMatrix()
{
//get list of elements
const G4int NbElm = fMaterial->GetNumberOfElements();
const G4ElementVector* ElementVector = fMaterial->GetElementVector();
G4int* Z = new G4int[NbElm]; //Atomic number
//determine the total number of energy-intervals for this material
fMatNbOfIntervals = 0;
G4int elm;
for (elm=0; elm<NbElm; elm++)
{ Z[elm] = (int)(*ElementVector)(elm)->GetZ();
fMatNbOfIntervals += fNbOfIntervals[Z[elm]];
}
//create the sandia matrix for this material
fMatSandiaMatrix = new G4OrderedTable(fMatNbOfIntervals);
G4int interval;
for (interval=0; interval<fMatNbOfIntervals; interval++)
(*fMatSandiaMatrix)(interval) = new G4ValVector(5);
//copy the Energy bins (take care of the Ionization Potential)
G4double Ebin;
interval=0;
for (elm=0; elm<NbElm; elm++)
for (G4int row=fCumulInterval[Z[elm]-1];row<fCumulInterval[Z[elm]];row++)
{ Ebin = fSandiaTable[row][0]*keV;
if ((row==fCumulInterval[Z[elm]-1])&&(GetIonizationPot(Z[elm])<Ebin))
Ebin = GetIonizationPot(Z[elm]);
(*(*fMatSandiaMatrix)(interval++))(0) = Ebin;
}
//sort the energies in increasing values
G4double tmp;
for (G4int i1=0; i1<fMatNbOfIntervals; i1++)
for (G4int i2=i1+1; i2<fMatNbOfIntervals; i2++)
{if ((*(*fMatSandiaMatrix)(i1))(0) > (*(*fMatSandiaMatrix)(i2))(0))
{
tmp = (*(*fMatSandiaMatrix)(i1))(0);
(*(*fMatSandiaMatrix)(i1))(0) = (*(*fMatSandiaMatrix)(i2))(0);
(*(*fMatSandiaMatrix)(i2))(0) = tmp;
}
}
//ready to compute the Sandia coefs for the material
const G4double* NbOfAtomsPerVolume = fMaterial->GetVecNbOfAtomsPerVolume();
for (interval=0; interval<fMatNbOfIntervals; interval++)
{
Ebin = (*(*fMatSandiaMatrix)(interval))(0);
for (elm=0; elm<NbElm; elm++)
{
GetSandiaCofPerAtom(Z[elm], Ebin);
for (G4int j=1; j<5; j++)
(*(*fMatSandiaMatrix)(interval))(j) += NbOfAtomsPerVolume[elm]*
fSandiaCofPerAtom[j-1];
}
}
delete [] Z;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4double G4SandiaTable::GetSandiaCofForMaterial(G4int interval, G4int j)
{
assert (interval>=0 && interval<fMatNbOfIntervals && j>=0 && j<5);
return ((*(*fMatSandiaMatrix)(interval))(j));
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
G4double* G4SandiaTable::GetSandiaCofForMaterial(G4double energy)
{
G4int interval = fMatNbOfIntervals - 1;
while ((interval>0)&&(energy<(*(*fMatSandiaMatrix)(interval))(0))) interval--;
return &((*(*fMatSandiaMatrix)(interval))(1));
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....