Import Geant4 9.3.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-09 16:15:05 +02:00
parent b79225fb37
commit 74cad5e589
3877 changed files with 234205 additions and 167127 deletions
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BetheBlochModel.hh,v 1.16 2008/10/22 16:00:57 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4BetheBlochModel.hh,v 1.20 2009/04/23 17:44:43 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -63,11 +63,10 @@
#define G4BetheBlochModel_h 1
#include "G4VEmModel.hh"
#include "G4NistManager.hh"
class G4EmCorrections;
class G4ParticleChangeForLoss;
class G4NistManager;
class G4BetheBlochModel : public G4VEmModel
{
@@ -81,8 +80,8 @@ public:
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
G4double MinEnergyCut(const G4ParticleDefinition*,
const G4MaterialCutsCouple*);
virtual G4double MinEnergyCut(const G4ParticleDefinition*,
const G4MaterialCutsCouple*);
virtual G4double ComputeCrossSectionPerElectron(
const G4ParticleDefinition*,
@@ -130,12 +129,16 @@ public:
protected:
G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kinEnergy);
virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kinEnergy);
private:
void SetParticle(const G4ParticleDefinition* p);
inline void SetupParameters();
inline void SetParticle(const G4ParticleDefinition* p);
inline void SetGenericIon(const G4ParticleDefinition* p);
// hide assignment operator
G4BetheBlochModel & operator=(const G4BetheBlochModel &right);
@@ -165,17 +168,46 @@ private:
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4BetheBlochModel::MaxSecondaryEnergy(
const G4ParticleDefinition* pd,
G4double kinEnergy)
inline void G4BetheBlochModel::SetupParameters()
{
if(isIon) SetParticle(pd);
G4double tau = kinEnergy/mass;
G4double tmax = 2.0*electron_mass_c2*tau*(tau + 2.) /
(1. + 2.0*(tau + 1.)*ratio + ratio*ratio);
return std::min(tmax,tlimit);
mass = particle->GetPDGMass();
spin = particle->GetPDGSpin();
G4double q = particle->GetPDGCharge()/eplus;
chargeSquare = q*q;
ratio = electron_mass_c2/mass;
G4double magmom = particle->GetPDGMagneticMoment()*mass/(0.5*eplus*hbar_Planck*c_squared);
magMoment2 = magmom*magmom - 1.0;
formfact = 0.0;
if(particle->GetLeptonNumber() == 0) {
G4double x = 0.8426*GeV;
if(spin == 0.0 && mass < GeV) {x = 0.736*GeV;}
else if(mass > GeV) {
x /= nist->GetZ13(mass/proton_mass_c2);
// tlimit = 51.2*GeV*A13[iz]*A13[iz];
}
formfact = 2.0*electron_mass_c2/(x*x);
tlimit = 2.0/formfact;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4BetheBlochModel::SetParticle(const G4ParticleDefinition* p)
{
if(particle != p) {
particle = p;
if (p->GetPDGCharge()/eplus > 1.5 && p->GetBaryonNumber() > 2) isIon = true;
SetupParameters();
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4BetheBlochModel::SetGenericIon(const G4ParticleDefinition* p)
{
if(p && particle != p) {
if(p->GetParticleName() == "GenericIon") isIon = true;
}
}
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BohrFluctuations.hh,v 1.3 2007/09/27 13:53:11 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4BohrFluctuations.hh,v 1.4 2009/02/19 19:17:50 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -78,8 +78,6 @@ public:
void InitialiseMe(const G4ParticleDefinition*);
protected:
private:
// hide assignment operator
@@ -102,26 +100,5 @@ private:
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4BohrFluctuations::Dispersion(
const G4Material* material,
const G4DynamicParticle* dp,
G4double& tmax,
G4double& length)
{
if(!particle) InitialiseMe(dp->GetDefinition());
G4double electronDensity = material->GetElectronDensity();
kineticEnergy = dp->GetKineticEnergy();
G4double etot = kineticEnergy + particleMass;
beta2 = kineticEnergy*(kineticEnergy + 2.0*particleMass)/(etot*etot);
G4double siga = (1.0/beta2 - 0.5) * twopi_mc2_rcl2 * tmax * length
* electronDensity * chargeSquare;
return siga;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BraggIonModel.hh,v 1.11 2008/10/22 16:00:57 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4BraggIonModel.hh,v 1.12 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -76,8 +76,8 @@ public:
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
G4double MinEnergyCut(const G4ParticleDefinition*,
const G4MaterialCutsCouple*);
virtual G4double MinEnergyCut(const G4ParticleDefinition*,
const G4MaterialCutsCouple*);
virtual G4double ComputeCrossSectionPerElectron(
const G4ParticleDefinition*,
@@ -127,8 +127,8 @@ public:
protected:
G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kinEnergy);
virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kinEnergy);
private:
@@ -179,19 +179,6 @@ private:
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double G4BraggIonModel::MaxSecondaryEnergy(
const G4ParticleDefinition* pd,
G4double kinEnergy)
{
if(pd != particle) SetParticle(pd);
G4double tau = kinEnergy/mass;
G4double tmax = 2.0*electron_mass_c2*tau*(tau + 2.) /
(1. + 2.0*(tau + 1.)*ratio + ratio*ratio);
return tmax;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline void G4BraggIonModel::SetParticle(const G4ParticleDefinition* p)
{
particle = p;
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BraggModel.hh,v 1.12 2008/09/14 17:11:48 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4BraggModel.hh,v 1.14 2009/11/10 19:25:47 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -79,8 +79,8 @@ public:
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
G4double MinEnergyCut(const G4ParticleDefinition*,
const G4MaterialCutsCouple*);
virtual G4double MinEnergyCut(const G4ParticleDefinition*,
const G4MaterialCutsCouple*);
virtual G4double ComputeCrossSectionPerElectron(
const G4ParticleDefinition*,
@@ -120,22 +120,23 @@ public:
virtual G4double GetParticleCharge(const G4ParticleDefinition* p,
const G4Material* mat,
G4double kineticEnergy);
/*
// add correction to energy loss and compute non-ionizing energy loss
virtual void CorrectionsAlongStep(const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double& eloss,
G4double& niel,
G4double length);
*/
protected:
G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kinEnergy);
virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kinEnergy);
private:
void SetParticle(const G4ParticleDefinition* p);
inline void SetParticle(const G4ParticleDefinition* p);
G4bool HasMaterial(const G4Material* material);
@@ -184,19 +185,6 @@ private:
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double G4BraggModel::MaxSecondaryEnergy(
const G4ParticleDefinition* pd,
G4double kinEnergy)
{
if(pd != particle) SetParticle(pd);
G4double tau = kinEnergy/mass;
G4double tmax = 2.0*electron_mass_c2*tau*(tau + 2.) /
(1. + 2.0*(tau + 1.)*ratio + ratio*ratio);
return tmax;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline void G4BraggModel::SetParticle(const G4ParticleDefinition* p)
{
particle = p;
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4ComptonScattering.hh,v 1.20 2007/05/23 08:47:34 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4ComptonScattering.hh,v 1.21 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
//------------------ G4ComptonScattering physics process -----------------------
// by Michel Maire, April 1996
@@ -81,12 +81,11 @@ public: // with description
virtual ~G4ComptonScattering();
// true for Gamma only.
G4bool IsApplicable(const G4ParticleDefinition&);
virtual G4bool IsApplicable(const G4ParticleDefinition&);
// Print few lines of informations about the process: validity range,
virtual void PrintInfo();
protected:
virtual void InitialiseProcess(const G4ParticleDefinition*);
@@ -96,15 +95,6 @@ private:
G4bool isInitialised;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline
G4bool G4ComptonScattering::IsApplicable(const G4ParticleDefinition& p)
{
return (&p == G4Gamma::Gamma());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4CoulombScattering.hh,v 1.11 2008/06/13 08:19:43 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4CoulombScattering.hh,v 1.13 2009/05/07 18:41:45 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -58,7 +58,7 @@ class G4CoulombScattering : public G4VEmProcess
public:
G4CoulombScattering(const G4String& name = "eCoulombScat");
G4CoulombScattering(const G4String& name = "CoulombScat");
virtual ~G4CoulombScattering();
@@ -103,13 +103,6 @@ private:
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4bool G4CoulombScattering::IsApplicable(const G4ParticleDefinition& p)
{
return (p.GetPDGCharge() != 0.0 && !p.IsShortLived());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4CoulombScattering::SetThetaMin(G4double val)
{
thetaMin = val;
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4GammaConversion.hh,v 1.22 2007/05/23 08:47:34 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4GammaConversion.hh,v 1.23 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
//
//------------------ G4GammaConversion physics process------------------------
@@ -84,7 +84,7 @@ public: // with description
virtual ~G4GammaConversion();
// true for Gamma only.
G4bool IsApplicable(const G4ParticleDefinition&);
virtual G4bool IsApplicable(const G4ParticleDefinition&);
// Print few lines of informations about the process: validity range,
virtual void PrintInfo();
@@ -98,14 +98,6 @@ private:
G4bool isInitialised;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4bool G4GammaConversion::IsApplicable(const G4ParticleDefinition& p)
{
return (&p == G4Gamma::Gamma());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -0,0 +1,183 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4GoudsmitSaundersonMscModel.hh,v 1.2 2009/06/04 13:45:49 gunter Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
//
// GEANT4 Class header file
//
//
// File name: G4GoudsmitSaundersonMscModel
//
// Author: Omrane Kadri
//
// Creation date: 20.02.2009
//
// Modifications:
// 04.03.2009 V.Ivanchenko cleanup and format according to Geant4 EM style
//
// Class description:
//
// Multiple scattering model using classical Goudsmit-Saunderson model
//
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//REFERENCES:
//Ref.1:E. Benedito et al.,"Mixed simulation ... cross-sections", NIMB 174 (2001) pp 91-110;
//Ref.2:I. Kawrakow et al.,"On the condensed ... transport",NIMB 142 (1998) pp 253-280;
//Ref.3:I. Kawrakow et al.,"On the representation ... calculations",NIMB 134 (1998) pp 325-336;
//Ref.4:I. Kawrakow et al.,"The EGSnrc code ... Transport",NRCC Report PIRS-701, Sept. 21, 2006;
//Ref.5:F. Salvat et al.,"ELSEPA--Dirac partial ...molecules", Comp. Phys. Comm. 165 (2005) pp 157-190;
//Ref.6:G4UrbanMscModel G4_v9.1Ref09;
//Ref.7:G4eCoulombScatteringModel G4_v9.1Ref09.
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#ifndef G4GoudsmitSaundersonMscModel_h
#define G4GoudsmitSaundersonMscModel_h 1
#include "G4VMscModel.hh"
#include "G4PhysicsTable.hh"
#include "globals.hh"
#include "G4DataInterpolation.hh"
class G4DataVector;
class G4ParticleChangeForMSC;
class G4LossTableManager;
class G4GoudsmitSaundersonTable;
class G4PhysicsTable;
class G4GoudsmitSaundersonMscModel : public G4VMscModel
{
public:
G4GoudsmitSaundersonMscModel(const G4String& nam = "GoudsmitSaunderson");
virtual ~G4GoudsmitSaundersonMscModel();
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition* particle,
G4double KineticEnergy,
G4double AtomicNumber, G4double,
G4double, G4double);
virtual void SampleScattering(const G4DynamicParticle* ,
G4double );
virtual G4double ComputeTruePathLengthLimit(
const G4Track& track,
G4PhysicsTable* theLambdaTable,
G4double currentMinimalStep);
virtual G4double ComputeGeomPathLength(G4double truePathLength);
virtual G4double ComputeTrueStepLength(G4double geomStepLength);
private:
void SampleCosineTheta(G4double,G4double,G4double &,G4double &);
void CalculateIntegrals(const G4ParticleDefinition* ,G4double,G4double,
G4double&,G4double&);
void LoadELSEPAXSections();
inline void SetParticle(const G4ParticleDefinition* p);
inline G4double GetLambda(G4double);
// hide assignment operator
G4GoudsmitSaundersonMscModel & operator=(const G4GoudsmitSaundersonMscModel &right);
G4GoudsmitSaundersonMscModel(const G4GoudsmitSaundersonMscModel&);
G4double lowKEnergy;
G4double highKEnergy;
G4double currentKinEnergy;
G4double currentRange;
G4double smallstep,tlimitminfix,skindepth;
G4double fr,rangeinit,masslimite,tgeom;
G4double par1,par2,par3,zPathLength,truePathLength;
G4double tausmall,taulim,tlimit,tlimitmin,geommin,geombig;
G4double charge,lambdalimit;
G4double tPathLength,stepmin ;
G4double lambda1,lambda11;
G4double mass;
G4double lambda0;
G4int currentMaterialIndex;
G4bool inside;
G4bool insideskin;
G4bool isInitialized;
G4PhysicsTable* theLambdaTable;
G4GoudsmitSaundersonTable* GSTable;
G4LossTableManager* theManager;
const G4ParticleDefinition* particle;
G4ParticleChangeForMSC* fParticleChange;
G4DataInterpolation* MyValue;
const G4MaterialCutsCouple* currentCouple;
static G4double ener[106];
static G4double TCSE[103][106];
static G4double FTCSE[103][106];
static G4double TCSP[103][106];
static G4double FTCSP[103][106];
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
void G4GoudsmitSaundersonMscModel::SetParticle(const G4ParticleDefinition* p)
{
if (p != particle) {
particle = p;
mass = p->GetPDGMass();
charge = p->GetPDGCharge()/eplus;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double G4GoudsmitSaundersonMscModel::GetLambda(G4double e)
{
G4double x;
if(theLambdaTable) {
G4bool b;
x = ((*theLambdaTable)[currentMaterialIndex])->GetValue(e, b);
} else {
x = CrossSection(currentCouple,particle,e);
}
if(x > DBL_MIN) x = 1./x;
else x = DBL_MAX;
return x;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -0,0 +1,74 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4GoudsmitSaundersonTable.hh,v 1.3 2009/06/18 18:43:09 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
// File name: G4GoudsmitSaundersonTable
//
// Author: Omrane Kadri
//
// Creation date: 20.02.2009
//
// Modifications:
// 04.03.2009 V.Ivanchenko cleanup and format according to Geant4 EM style
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#ifndef G4GoudsmitSaundersonTable_h
#define G4GoudsmitSaundersonTable_h 1
#include "globals.hh"
class G4GoudsmitSaundersonTable
{
public:
G4GoudsmitSaundersonTable();
~G4GoudsmitSaundersonTable();
G4double SampleTheta(G4double , G4double ,G4double);
private:
// hide assignment operator
G4GoudsmitSaundersonTable & operator=(const G4GoudsmitSaundersonTable &right);
G4GoudsmitSaundersonTable(const G4GoudsmitSaundersonTable&);
void LoadPDFandCPDFdata();
static G4double* PDF;
static G4double* CPDF;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -0,0 +1,107 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4HeatedKleinNishinaCompton.hh,v 1.2 2009/04/11 13:05:03 grichine Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
//
// File name: G4HeatedKleinNishinaCompton
//
// Author: Vladimir Grichine on base of M. Maire and V. Ivanchenko code
//
// Creation date: 15.03.2009
//
// Modifications:
//
//
//
// Class Description:
//
// Implementation of gamma Compton scattering on heated electrons
// Maxwell distributed with the temperature fTemperature (default = 1*keV)
//
// -------------------------------------------------------------------
//
#ifndef G4HeatedKleinNishinaCompton_h
#define G4HeatedKleinNishinaCompton_h 1
#include "G4VEmModel.hh"
class G4ParticleChangeForGamma;
class G4HeatedKleinNishinaCompton : public G4VEmModel
{
public:
G4HeatedKleinNishinaCompton(const G4ParticleDefinition* p = 0,
const G4String& nam = "Heated-Klein-Nishina");
virtual ~G4HeatedKleinNishinaCompton();
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
virtual G4double ComputeCrossSectionPerAtom(
const G4ParticleDefinition*,
G4double kinEnergy,
G4double Z,
G4double A,
G4double cut,
G4double emax);
virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double tmin,
G4double maxEnergy);
void SetElectronTemperature(G4double t){fTemperature=t;};
G4double GetElectronTemperature(){return fTemperature;};
protected:
G4ParticleDefinition* theGamma;
G4ParticleDefinition* theElectron;
G4ParticleChangeForGamma* fParticleChange;
G4double lowestGammaEnergy;
G4double fTemperature; // electron temperature in energy units
private:
// hide assignment operator
G4HeatedKleinNishinaCompton & operator=(const G4HeatedKleinNishinaCompton &right);
G4HeatedKleinNishinaCompton(const G4HeatedKleinNishinaCompton&);
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif
@@ -0,0 +1,119 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4ICRU49NuclearStoppingModel.hh,v 1.2 2009/11/10 19:25:47 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
//
// GEANT4 Class header file
//
//
// File name: G4ICRU49NuclearStoppingModel
//
// Author: V.Ivanchenko
//
// Creation date: 20.07.2009
//
// Modifications:
//
//
// Class Description:
//
// Implementation of the ICRU'49 model of nuclear stopping
// -------------------------------------------------------------------
//
#ifndef G4ICRU49NuclearStoppingModel_h
#define G4ICRU49NuclearStoppingModel_h 1
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "G4VEmModel.hh"
class G4ParticleChangeForLoss;
class G4Pow;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4ICRU49NuclearStoppingModel : public G4VEmModel
{
public:
G4ICRU49NuclearStoppingModel(const G4String& nam = "ICRU49NucStopping");
virtual ~G4ICRU49NuclearStoppingModel();
virtual void Initialise(const G4ParticleDefinition*,
const G4DataVector&);
// main method to compute dEdx
virtual G4double ComputeDEDXPerVolume(const G4Material*,
const G4ParticleDefinition*,
G4double kineticEnergy,
G4double cutEnergy = DBL_MAX);
virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double, G4double);
inline void SetFluctuationFlag(G4bool);
private:
void InitialiseNuclearStopping();
G4double NuclearStoppingPower(G4double kineticEnergy,
G4double Z1, G4double Z2,
G4double A1, G4double A2);
// hide assignment operator
G4ICRU49NuclearStoppingModel & operator=(const G4ICRU49NuclearStoppingModel &right);
G4ICRU49NuclearStoppingModel(const G4ICRU49NuclearStoppingModel&);
G4Pow* g4pow;
static G4double ed[104];
static G4double ad[104];
G4double theZieglerFactor;
// flags
G4bool lossFlucFlag;
};
inline void G4ICRU49NuclearStoppingModel::SetFluctuationFlag(G4bool val)
{
lossFlucFlag = val;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4IonFluctuations.hh,v 1.8 2008/10/22 16:04:33 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4IonFluctuations.hh,v 1.9 2009/02/19 19:17:50 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -83,7 +83,7 @@ public:
void InitialiseMe(const G4ParticleDefinition*);
// Initialisation prestep
inline void SetParticleAndCharge(const G4ParticleDefinition*, G4double q2);
void SetParticleAndCharge(const G4ParticleDefinition*, G4double q2);
private:
@@ -116,21 +116,5 @@ private:
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline
void G4IonFluctuations::SetParticleAndCharge(const G4ParticleDefinition* part,
G4double q2)
{
if(part != particle) {
particle = part;
particleMass = part->GetPDGMass();
charge = part->GetPDGCharge()/eplus;
chargeSquare = charge*charge;
}
effChargeSquare = q2;
uniFluct.SetParticleAndCharge(part, q2);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4MollerBhabhaModel.hh,v 1.19 2007/05/22 17:34:36 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4MollerBhabhaModel.hh,v 1.20 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -73,8 +73,8 @@ public:
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
G4double MinEnergyCut(const G4ParticleDefinition*,
const G4MaterialCutsCouple*);
virtual G4double MinEnergyCut(const G4ParticleDefinition*,
const G4MaterialCutsCouple*);
virtual G4double ComputeCrossSectionPerElectron(
const G4ParticleDefinition*,
@@ -108,10 +108,10 @@ public:
protected:
G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kinEnergy);
virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kinEnergy);
void SetParticle(const G4ParticleDefinition* p);
inline void SetParticle(const G4ParticleDefinition* p);
const G4ParticleDefinition* particle;
G4ParticleDefinition* theElectron;
@@ -126,17 +126,17 @@ private:
// hide assignment operator
G4MollerBhabhaModel & operator=(const G4MollerBhabhaModel &right);
G4MollerBhabhaModel(const G4MollerBhabhaModel&);
G4bool isInitialised;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double G4MollerBhabhaModel::MaxSecondaryEnergy(
const G4ParticleDefinition*,
G4double kinEnergy)
inline void G4MollerBhabhaModel::SetParticle(const G4ParticleDefinition* p)
{
G4double tmax = kinEnergy;
if(isElectron) tmax *= 0.5;
return tmax;
particle = p;
if(p != theElectron) isElectron = false;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4MscModel71.hh,v 1.5 2007/05/22 17:34:36 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4MscModel71.hh,v 1.6 2009/11/01 13:04:12 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -80,7 +80,7 @@ class G4MscModel71 : public G4VEmModel
public:
G4MscModel71(G4double&, G4double&, G4double&, G4double&, G4bool&,
const G4String& nam = "MscUni");
const G4String& nam = "UrbanMsc71");
virtual ~G4MscModel71();
@@ -0,0 +1,109 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4NuclearStopping.hh,v 1.2 2009/11/10 19:25:47 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -----------------------------------------------------------------------------
//
// GEANT4 Class header file
//
// Author: Vladimir Ivanchenko
//
// Creation date: 20 July 2009
//
// Modified:
//
//------------------------------------------------------------------------------
//
// class description
//
// The class simulates nuclear stopping due to multiple scattering
//
// class description - end
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#ifndef G4NuclearStopping_h
#define G4NuclearStopping_h 1
#include "G4VEmProcess.hh"
#include "globals.hh"
#include "G4Track.hh"
#include "G4Step.hh"
#include "G4ParticleDefinition.hh"
#include "G4GPILSelection.hh"
#include "G4ParticleChangeForLoss.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4ICRU49NuclearStoppingModel;
class G4NuclearStopping : public G4VEmProcess
{
public: // with description
G4NuclearStopping(const G4String& processName="nuclearStopping");
virtual ~G4NuclearStopping();
// returns true for charged particles, false otherwise
G4bool IsApplicable (const G4ParticleDefinition& p);
// implementation of pure virtual method
G4double AlongStepGetPhysicalInteractionLength(const G4Track& track,
G4double previousStepSize,
G4double currentMinimumStep,
G4double& proposedSafety,
G4GPILSelection* selection);
// implementation of energy loss along step
G4VParticleChange* AlongStepDoIt(const G4Track& track,
const G4Step& step);
// Print few lines of informations about the process: validity range,
void PrintInfo();
protected:
// This function initialise process
void InitialiseProcess(const G4ParticleDefinition*);
private:
G4ParticleChangeForLoss nParticleChange;
G4ICRU49NuclearStoppingModel* modelICRU49;
G4bool isInitialized;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -23,6 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4PAIModel.hh,v 1.22 2009/02/19 19:17:50 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -74,14 +76,14 @@ public:
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
virtual void InitialiseMe(const G4ParticleDefinition*) {};
virtual void InitialiseMe(const G4ParticleDefinition*);
virtual G4double ComputeDEDX(const G4MaterialCutsCouple*,
virtual G4double ComputeDEDXPerVolume(const G4Material*,
const G4ParticleDefinition*,
G4double kineticEnergy,
G4double cutEnergy);
virtual G4double CrossSection(const G4MaterialCutsCouple*,
virtual G4double CrossSectionPerVolume(const G4Material*,
const G4ParticleDefinition*,
G4double kineticEnergy,
G4double cutEnergy,
@@ -118,8 +120,6 @@ public:
void SetVerboseLevel(G4int verbose){fVerbose=verbose;};
protected:
G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
@@ -191,30 +191,6 @@ private:
G4bool isInitialised;
};
/////////////////////////////////////////////////////////////////////
inline G4double G4PAIModel::MaxSecondaryEnergy( const G4ParticleDefinition* p,
G4double kinEnergy)
{
G4double tmax = kinEnergy;
if(p == fElectron) tmax *= 0.5;
else if(p != fPositron) {
G4double mass = p->GetPDGMass();
G4double ratio= electron_mass_c2/mass;
G4double gamma= kinEnergy/mass + 1.0;
tmax = 2.0*electron_mass_c2*(gamma*gamma - 1.) /
(1. + 2.0*gamma*ratio + ratio*ratio);
}
return tmax;
}
///////////////////////////////////////////////////////////////
inline void G4PAIModel::DefineForRegion(const G4Region* r)
{
fPAIRegionVector.push_back(r);
}
#endif
@@ -23,6 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4PAIPhotonModel.hh,v 1.12 2009/02/19 19:17:50 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -73,18 +75,18 @@ public:
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
virtual void InitialiseMe(const G4ParticleDefinition*) {};
virtual void InitialiseMe(const G4ParticleDefinition*);
virtual G4double ComputeDEDX(const G4MaterialCutsCouple*,
const G4ParticleDefinition*,
G4double kineticEnergy,
G4double cutEnergy);
virtual G4double ComputeDEDXPerVolume(const G4Material*,
const G4ParticleDefinition*,
G4double kineticEnergy,
G4double cutEnergy);
virtual G4double CrossSection(const G4MaterialCutsCouple*,
const G4ParticleDefinition*,
G4double kineticEnergy,
G4double cutEnergy,
G4double maxEnergy);
virtual G4double CrossSectionPerVolume(const G4Material*,
const G4ParticleDefinition*,
G4double kineticEnergy,
G4double cutEnergy,
G4double maxEnergy);
virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
const G4MaterialCutsCouple*,
@@ -121,12 +123,10 @@ public:
G4double GetEnergyTransfer(G4PhysicsTable*, G4int iPlace,
G4double position, G4int iTransfer );
protected:
G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kinEnergy);
G4double kinEnergy);
private:
@@ -145,8 +145,6 @@ private:
G4int fVerbose;
G4PhysicsLogVector* fProtonEnergyVector ;
// vectors
G4PhysicsTable* fPAItransferTable;
@@ -203,30 +201,6 @@ private:
G4bool isInitialised;
};
/////////////////////////////////////////////////////////////////////
inline G4double G4PAIPhotonModel::MaxSecondaryEnergy( const G4ParticleDefinition* p,
G4double kinEnergy)
{
G4double tmax = kinEnergy;
if(p == fElectron) tmax *= 0.5;
else if(p != fPositron) {
G4double mass = p->GetPDGMass();
G4double ratio= electron_mass_c2/mass;
G4double gamma= kinEnergy/mass + 1.0;
tmax = 2.0*electron_mass_c2*(gamma*gamma - 1.) /
(1. + 2.0*gamma*ratio + ratio*ratio);
}
return tmax;
}
///////////////////////////////////////////////////////////////
inline void G4PAIPhotonModel::DefineForRegion(const G4Region* r)
{
fPAIRegionVector.push_back(r);
}
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4PEEffectModel.hh,v 1.6 2007/05/22 17:34:36 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4PEEffectModel.hh,v 1.7 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -40,6 +40,8 @@
// Modifications:
//
// 06.02.2006 : added ComputeMeanFreePath() (mma)
// 20.02.2009 : move virtual inline to .cc, substitute
// ComputeMeanFreePath() by CrossSectionPerVolume (VI)
//
// Class Description:
//
@@ -69,16 +71,17 @@ public:
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition*,
G4double kinEnergy,
G4double Z,
G4double A,
G4double, G4double);
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition*,
G4double kinEnergy,
G4double Z,
G4double A,
G4double, G4double);
G4double ComputeMeanFreePath( const G4ParticleDefinition*,
G4double kinEnergy,
const G4Material* material,
G4double, G4double);
virtual G4double CrossSectionPerVolume(const G4Material*,
const G4ParticleDefinition*,
G4double kineticEnergy,
G4double cutEnergy,
G4double maxEnergy);
virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
const G4MaterialCutsCouple*,
@@ -99,45 +102,6 @@ private:
G4bool isInitialized;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
inline G4double G4PEEffectModel::ComputeCrossSectionPerAtom(
const G4ParticleDefinition*,
G4double energy,
G4double Z, G4double,
G4double, G4double)
{
G4double* SandiaCof = G4SandiaTable::GetSandiaCofPerAtom((G4int)Z, energy);
G4double energy2 = energy*energy, energy3 = energy*energy2,
energy4 = energy2*energy2;
return SandiaCof[0]/energy + SandiaCof[1]/energy2 +
SandiaCof[2]/energy3 + SandiaCof[3]/energy4;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4PEEffectModel::ComputeMeanFreePath(
const G4ParticleDefinition*,
G4double energy,
const G4Material* material,
G4double, G4double)
{
G4double* SandiaCof = material->GetSandiaTable()
->GetSandiaCofForMaterial(energy);
G4double energy2 = energy*energy, energy3 = energy*energy2,
energy4 = energy2*energy2;
G4double cross = SandiaCof[0]/energy + SandiaCof[1]/energy2 +
SandiaCof[2]/energy3 + SandiaCof[3]/energy4;
G4double mfp = DBL_MAX;
if (cross > 0.) mfp = 1./cross;
return mfp;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif
@@ -0,0 +1,297 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4PairProductionRelModel.hh,v 1.3 2009/06/04 13:45:53 gunter Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
//
// File name: G4PairProductionRelModel
//
// Author: Andreas Schaelicke
//
// Creation date: 02.04.2009
//
// Modifications:
//
// Class Description:
//
// Implementation of gamma convertion to e+e- in the field of a nucleus
// relativistic approximation
//
// -------------------------------------------------------------------
//
#ifndef G4PairProductionRelModel_h
#define G4PairProductionRelModel_h 1
#include "G4VEmModel.hh"
#include "G4PhysicsTable.hh"
#include "G4NistManager.hh"
class G4ParticleChangeForGamma;
class G4PairProductionRelModel : public G4VEmModel
{
public:
G4PairProductionRelModel(const G4ParticleDefinition* p = 0,
const G4String& nam = "Bethe-Heitler");
virtual ~G4PairProductionRelModel();
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
virtual G4double ComputeCrossSectionPerAtom(
const G4ParticleDefinition*,
G4double kinEnergy,
G4double Z,
G4double A=0.,
G4double cut=0.,
G4double emax=DBL_MAX);
virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double tmin,
G4double maxEnergy);
virtual void SetupForMaterial(const G4ParticleDefinition*,
const G4Material*,G4double);
// * fast inline functions *
inline void SetCurrentElement(const G4double);
// set / get methods
inline void SetLPMconstant(G4double val);
inline G4double LPMconstant() const;
inline void SetLPMflag(G4bool);
inline G4bool LPMflag() const;
protected:
// screening functions
inline G4double Phi1(G4double delta) const;
inline G4double Phi2(G4double delta) const;
inline G4double DeltaMax() const;
inline G4double DeltaMin(G4double) const;
// lpm functions
void CalcLPMFunctions(G4double k, G4double eplus);
// obsolete
G4double ScreenFunction1(G4double ScreenVariable);
G4double ScreenFunction2(G4double ScreenVariable);
G4double ComputeXSectionPerAtom(G4double totalEnergy, G4double Z);
G4double ComputeDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double Z);
G4double ComputeRelDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double Z);
// hide assignment operator
G4PairProductionRelModel & operator=(const G4PairProductionRelModel &right);
G4PairProductionRelModel(const G4PairProductionRelModel&);
G4NistManager* nist;
G4ParticleDefinition* theGamma;
G4ParticleDefinition* theElectron;
G4ParticleDefinition* thePositron;
G4ParticleChangeForGamma* fParticleChange;
G4PhysicsTable* theCrossSectionTable;
G4double lowGammaEnergy;
G4double highGammaEnergy;
G4int nbins;
size_t indexZ[120];
G4double fLPMconstant;
G4bool fLPMflag;
// cash
G4double z13, z23, lnZ;
G4double Fel, Finel, fCoulomb;
G4double currentZ;
// LPM effect
G4double lpmEnergy;
G4double xiLPM, phiLPM, gLPM;
// consts
G4bool use_completescreening;
static const G4double xgi[8], wgi[8];
static const G4double Fel_light[5];
static const G4double Finel_light[5];
static const G4double facFel;
static const G4double facFinel;
static const G4double preS1, logTwo;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline
void G4PairProductionRelModel::SetLPMconstant(G4double val)
{
fLPMconstant = val;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline
G4double G4PairProductionRelModel::LPMconstant() const
{
return fLPMconstant;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline
void G4PairProductionRelModel::SetLPMflag(G4bool val)
{
fLPMflag = val;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline
G4bool G4PairProductionRelModel::LPMflag() const
{
return fLPMflag;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline void G4PairProductionRelModel::SetCurrentElement(const G4double Z)
{
if(Z != currentZ) {
currentZ = Z;
G4int iz = G4int(Z);
z13 = nist->GetZ13(iz);
z23 = z13*z13;
lnZ = nist->GetLOGZ(iz);
if (iz <= 4) {
Fel = Fel_light[iz];
Finel = Finel_light[iz] ;
}
else {
Fel = facFel - lnZ/3. ;
Finel = facFinel - 2.*lnZ/3. ;
}
fCoulomb=GetCurrentElement()->GetfCoulomb();
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4PairProductionRelModel::Phi1(G4double delta) const
{
G4double screenVal;
if (delta > 1.)
screenVal = 21.12 - 4.184*std::log(delta+0.952);
else
screenVal = 20.868 - delta*(3.242 - 0.625*delta);
return screenVal;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double G4PairProductionRelModel::Phi2(G4double delta) const
{
G4double screenVal;
if (delta > 1.)
screenVal = 21.12 - 4.184*std::log(delta+0.952);
else
screenVal = 20.209 - delta*(1.930 + 0.086*delta);
return screenVal;
}
inline G4double G4PairProductionRelModel::ScreenFunction1(G4double ScreenVariable)
// compute the value of the screening function 3*PHI1 - PHI2
{
G4double screenVal;
if (ScreenVariable > 1.)
screenVal = 42.24 - 8.368*std::log(ScreenVariable+0.952);
else
screenVal = 42.392 - ScreenVariable*(7.796 - 1.961*ScreenVariable);
return screenVal;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double G4PairProductionRelModel::ScreenFunction2(G4double ScreenVariable)
// compute the value of the screening function 1.5*PHI1 + 0.5*PHI2
{
G4double screenVal;
if (ScreenVariable > 1.)
screenVal = 42.24 - 8.368*std::log(ScreenVariable+0.952);
else
screenVal = 41.405 - ScreenVariable*(5.828 - 0.8945*ScreenVariable);
return screenVal;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4PairProductionRelModel::DeltaMax() const
{
// k > 50 MeV
G4double FZ = 8.*(lnZ/3. + fCoulomb);
return std::exp( (42.24-FZ)/8.368 ) + 0.952;
}
inline G4double G4PairProductionRelModel::DeltaMin(G4double k) const
{
return 4.*136./z13*(electron_mass_c2/k);
}
#endif
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4PhotoElectricEffect.hh,v 1.24 2007/05/23 08:47:34 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4PhotoElectricEffect.hh,v 1.25 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
//
//------------------ G4PhotoElectricEffect physics process ------------------
@@ -90,29 +90,20 @@ public: // with description
virtual ~G4PhotoElectricEffect();
// true for Gamma only.
G4bool IsApplicable(const G4ParticleDefinition&);
virtual G4bool IsApplicable(const G4ParticleDefinition&);
// Print few lines of informations about the process: validity range,
void PrintInfo();
virtual void PrintInfo();
protected:
void InitialiseProcess(const G4ParticleDefinition*);
virtual void InitialiseProcess(const G4ParticleDefinition*);
private:
G4bool isInitialised;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline
G4bool G4PhotoElectricEffect::IsApplicable(const G4ParticleDefinition& p)
{
return (&p == G4Gamma::Gamma());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4UniversalFluctuation.hh,v 1.6 2008/10/22 16:04:33 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4UniversalFluctuation.hh,v 1.10 2009/03/19 14:15:17 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -69,23 +69,21 @@ public:
virtual ~G4UniversalFluctuation();
G4double SampleFluctuations(const G4Material*,
const G4DynamicParticle*,
G4double&,
G4double&,
G4double&);
virtual G4double SampleFluctuations(const G4Material*,
const G4DynamicParticle*,
G4double&,
G4double&,
G4double&);
G4double Dispersion( const G4Material*,
const G4DynamicParticle*,
G4double&,
G4double&);
virtual G4double Dispersion( const G4Material*,
const G4DynamicParticle*,
G4double&,
G4double&);
void InitialiseMe(const G4ParticleDefinition*);
virtual void InitialiseMe(const G4ParticleDefinition*);
// Initialisation prestep
inline void SetParticleAndCharge(const G4ParticleDefinition*, G4double q2);
protected:
virtual void SetParticleAndCharge(const G4ParticleDefinition*, G4double q2);
private:
@@ -112,9 +110,6 @@ private:
G4double ipotLogFluct;
G4double e0;
G4double facwidth;
G4double oldloss;
G4double samestep;
G4double e1,e2;
G4double minNumberInteractionsBohr;
@@ -125,19 +120,6 @@ private:
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void
G4UniversalFluctuation::SetParticleAndCharge(const G4ParticleDefinition* part,
G4double q2)
{
if(part != particle) {
particle = part;
particleMass = part->GetPDGMass();
}
chargeSquare = q2;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4UrbanMscModel.hh,v 1.33 2008/03/10 10:39:21 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4UrbanMscModel.hh,v 1.35 2009/04/29 13:30:22 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -36,46 +36,12 @@
//
// Author: Laszlo Urban
//
// Creation date: 01.03.2001
// Creation date: 06.03.2008
//
// Modifications:
//
// 27-03-03 Move model part from G4MultipleScattering (V.Ivanchenko)
// 27-03-03 Rename (V.Ivanchenko)
//
// 05-08-03 angle distribution has been modified (L.Urban)
// 26-11-03 new data member currentRange (L.Urban)
// 01-03-04 changes in data members + signature changed in SampleCosineTheta
// 11-03-04 changes in data members (L.Urban)
// 23-04-04 changes in data members and in signature of SampleCosineTheta
// (L.Urban)
// 17-08-04 name of data member facxsi changed to factail (L.Urban)
// 08-04-05 Major optimisation of internal interfaces (V.Ivantchenko)
// 15-04-05 optimize internal interface - add SampleSecondaries method (V.Ivanchenko)
// 11-08-05 computation of lateral correlation added (L.Urban)
// 02-10-05 nuclear size correction computation removed, the correction
// included in the (theoretical) tabulated values (L.Urban)
// 16-02-06 data members b and xsi have been removed (L.Urban)
// 17-02-06 Save table of transport cross sections not mfp (V.Ivanchenko)
// 07-03-06 Create G4UrbanMscModel and move there step limit calculation (V.Ivanchenko)
// 10-05-06 SetMscStepLimitation at initialisation (V.Ivantchenko)
// 11-05-06 name of data member safety changed to presafety, some new data
// members added (frscaling1,frscaling2,tlimitminfix,nstepmax)
// (L.Urban)
// 13-10-06 data member factail removed, data member tkinlimit changed
// to lambdalimit,
// new data members tgeom,tnow,skin,skindepth,Zeff,geomlimit
// G4double GeomLimit(const G4Track& track) changed to
// void GeomLimit(const G4Track& track) (L.Urban)
// 20-10-06 parameter theta0 now computed in the (public)
// function ComputeTheta0,
// single scattering modified allowing not small
// angles as well (L.Urban)
// 31-01-07 code cleaning (L.Urban)
// 06-02-07 Move SetMscStepLimitation method into the source (VI)
// 15-02-07 new data member : smallstep (L.Urban)
// 10-04-07 remove navigator, smallstep, tnow (V.Ivanchenko)
//
// 28-04-09 move G4UrbanMscModel2 from the g49.2 to G4UrbanMscModel.
// now it is frozen (V.Ivanchenk0)
//
// Class Description:
//
@@ -110,7 +76,7 @@ public:
virtual ~G4UrbanMscModel();
void Initialise(const G4ParticleDefinition*, const G4DataVector&);
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition* particle,
G4double KineticEnergy,
G4double AtomicNumber,
@@ -118,12 +84,6 @@ public:
G4double cut =0.,
G4double emax=DBL_MAX);
void SampleSecondaries(std::vector<G4DynamicParticle*>*,
const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double,
G4double);
void SampleScattering(const G4DynamicParticle*,
G4double safety);
@@ -140,18 +100,20 @@ public:
private:
G4double SimpleScattering(G4double xmeanth, G4double x2meanth);
G4double SampleCosineTheta(G4double trueStepLength, G4double KineticEnergy);
G4double SampleDisplacement();
G4double LatCorrelation();
void GeomLimit(const G4Track& track);
inline G4double GetLambda(G4double kinEnergy);
inline void SetParticle(const G4ParticleDefinition*);
inline void UpdateCache();
// hide assignment operator
G4UrbanMscModel & operator=(const G4UrbanMscModel &right);
G4UrbanMscModel(const G4UrbanMscModel&);
@@ -159,26 +121,23 @@ private:
const G4ParticleDefinition* particle;
G4ParticleChangeForMSC* fParticleChange;
G4SafetyHelper* safetyHelper;
G4PhysicsTable* theLambdaTable;
const G4MaterialCutsCouple* couple;
G4LossTableManager* theManager;
G4double mass;
G4double charge;
G4double masslimite,masslimitmu;
G4double charge,ChargeSquare;
G4double masslimite,lambdalimit,fr;
G4double taubig;
G4double tausmall;
G4double taulim;
G4double currentTau;
G4double frscaling1,frscaling2;
G4double tlimit;
G4double tlimitmin;
G4double tlimitminfix;
G4double tgeom;
G4double nstepmax;
G4double geombig;
G4double geommin;
G4double geomlimit;
@@ -197,18 +156,27 @@ private:
G4double currentKinEnergy;
G4double currentRange;
G4double rangeinit;
G4double currentRadLength;
G4double Zeff;
G4double theta0max,rellossmax;
G4double third;
G4int currentMaterialIndex;
G4double y;
G4double Zold;
G4double Zeff,Z2,Z23,lnZ;
G4double coeffth1,coeffth2;
G4double coeffc1,coeffc2;
G4double scr1ini,scr2ini,scr1,scr2;
G4bool isInitialized;
G4bool inside;
G4bool insideskin;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
@@ -235,10 +203,27 @@ void G4UrbanMscModel::SetParticle(const G4ParticleDefinition* p)
particle = p;
mass = p->GetPDGMass();
charge = p->GetPDGCharge()/eplus;
ChargeSquare = charge*charge;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
void G4UrbanMscModel::UpdateCache()
{
lnZ = std::log(Zeff);
coeffth1 = 0.885+lnZ*(0.104-0.0170*lnZ);
coeffth2 = 0.028+lnZ*(0.012-0.00125*lnZ);
coeffc1 = 2.134-lnZ*(0.1045-0.00602*lnZ);
coeffc2 = 0.001126-lnZ*(0.0001089+0.0000247*lnZ);
Z2 = Zeff*Zeff;
Z23 = std::exp(2.*lnZ/3.);
scr1 = scr1ini*Z23;
scr2 = scr2ini*Z2*ChargeSquare;
// lastMaterial = couple->GetMaterial();
Zold = Zeff;
}
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4UrbanMscModel2.hh,v 1.11 2008/12/18 13:01:34 gunter Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4UrbanMscModel2.hh,v 1.17 2009/05/15 09:26:42 urban Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -39,7 +39,7 @@
// Creation date: 06.03.2008
//
// Modifications:
//
// 23.04.2009 L.Urban updated parameterization in UpdateCache method
//
//
// Class Description:
@@ -83,12 +83,6 @@ public:
G4double cut =0.,
G4double emax=DBL_MAX);
void SampleSecondaries(std::vector<G4DynamicParticle*>*,
const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double,
G4double);
void SampleScattering(const G4DynamicParticle*,
G4double safety);
@@ -113,8 +107,6 @@ private:
G4double LatCorrelation();
void GeomLimit(const G4Track& track);
inline G4double GetLambda(G4double kinEnergy);
inline void SetParticle(const G4ParticleDefinition*);
@@ -128,12 +120,10 @@ private:
const G4ParticleDefinition* particle;
G4ParticleChangeForMSC* fParticleChange;
G4SafetyHelper* safetyHelper;
G4PhysicsTable* theLambdaTable;
const G4MaterialCutsCouple* couple;
G4LossTableManager* theManager;
G4double mass;
G4double charge,ChargeSquare;
G4double masslimite,lambdalimit,fr;
@@ -222,15 +212,19 @@ inline
void G4UrbanMscModel2::UpdateCache()
{
lnZ = std::log(Zeff);
coeffth1 = 0.885+lnZ*(0.104-0.0170*lnZ);
coeffth2 = 0.028+lnZ*(0.012-0.00125*lnZ);
coeffc1 = 2.134-lnZ*(0.1045-0.00602*lnZ);
coeffc2 = 0.001126-lnZ*(0.0001089+0.0000247*lnZ);
//new correction in theta0 formula
coeffth1 = (1.-8.7780e-2/Zeff)*(0.87+0.03*lnZ);
coeffth2 = (4.0780e-2+1.7315e-4*Zeff)*(0.87+0.03*lnZ);
// tail parameters
G4double lnZ1 = std::log(Zeff+1.);
coeffc1 = 2.943-0.197*lnZ1;
coeffc2 = 0.0987-0.0143*lnZ1;
// for single scattering
Z2 = Zeff*Zeff;
Z23 = std::exp(2.*lnZ/3.);
scr1 = scr1ini*Z23;
scr2 = scr2ini*Z2*ChargeSquare;
// lastMaterial = couple->GetMaterial();
Zold = Zeff;
}
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4UrbanMscModel90.hh,v 1.4 2008/10/29 14:15:30 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4UrbanMscModel90.hh,v 1.6 2009/11/01 13:04:12 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -69,7 +69,7 @@ class G4UrbanMscModel90 : public G4VMscModel
public:
G4UrbanMscModel90(const G4String& nam = "UrbanMscUni90");
G4UrbanMscModel90(const G4String& nam = "UrbanMsc90");
virtual ~G4UrbanMscModel90();
@@ -110,8 +110,6 @@ private:
G4double LatCorrelation();
void GeomLimit(const G4Track& track);
inline G4double GetLambda(G4double kinEnergy);
inline void SetParticle(const G4ParticleDefinition*);
@@ -0,0 +1,230 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4UrbanMscModel92.hh,v 1.1 2009/11/01 13:04:12 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
//
// GEANT4 Class header file
//
//
// File name: G4UrbanMscModel92
//
// Author: Laszlo Urban
//
// Creation date: 06.03.2008
//
// Modifications:
//
// 28-10-2009 V.Ivanchenko moved G4UrbanMscModel to G4UrbanMscModel92,
// now it is a frozen version of the Urban model corresponding
// to g4 9.2
//
// Class Description:
//
// Implementation of the model of multiple scattering based on
// H.W.Lewis Phys Rev 78 (1950) 526 and L.Urban model
// -------------------------------------------------------------------
//
#ifndef G4UrbanMscModel92_h
#define G4UrbanMscModel92_h 1
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "G4VMscModel.hh"
#include "G4PhysicsTable.hh"
#include "G4MscStepLimitType.hh"
class G4ParticleChangeForMSC;
class G4SafetyHelper;
class G4LossTableManager;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4UrbanMscModel92 : public G4VMscModel
{
public:
G4UrbanMscModel92(const G4String& nam = "UrbanMsc92");
virtual ~G4UrbanMscModel92();
void Initialise(const G4ParticleDefinition*, const G4DataVector&);
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition* particle,
G4double KineticEnergy,
G4double AtomicNumber,
G4double AtomicWeight=0.,
G4double cut =0.,
G4double emax=DBL_MAX);
void SampleScattering(const G4DynamicParticle*,
G4double safety);
G4double ComputeTruePathLengthLimit(const G4Track& track,
G4PhysicsTable* theLambdaTable,
G4double currentMinimalStep);
G4double ComputeGeomPathLength(G4double truePathLength);
G4double ComputeTrueStepLength(G4double geomStepLength);
G4double ComputeTheta0(G4double truePathLength,
G4double KineticEnergy);
private:
G4double SimpleScattering(G4double xmeanth, G4double x2meanth);
G4double SampleCosineTheta(G4double trueStepLength, G4double KineticEnergy);
G4double SampleDisplacement();
G4double LatCorrelation();
inline G4double GetLambda(G4double kinEnergy);
inline void SetParticle(const G4ParticleDefinition*);
inline void UpdateCache();
// hide assignment operator
G4UrbanMscModel92 & operator=(const G4UrbanMscModel92 &right);
G4UrbanMscModel92(const G4UrbanMscModel92&);
const G4ParticleDefinition* particle;
G4ParticleChangeForMSC* fParticleChange;
G4PhysicsTable* theLambdaTable;
const G4MaterialCutsCouple* couple;
G4LossTableManager* theManager;
G4double mass;
G4double charge,ChargeSquare;
G4double masslimite,lambdalimit,fr;
G4double taubig;
G4double tausmall;
G4double taulim;
G4double currentTau;
G4double tlimit;
G4double tlimitmin;
G4double tlimitminfix;
G4double tgeom;
G4double geombig;
G4double geommin;
G4double geomlimit;
G4double skindepth;
G4double smallstep;
G4double presafety;
G4double lambda0;
G4double lambdaeff;
G4double tPathLength;
G4double zPathLength;
G4double par1,par2,par3;
G4double stepmin;
G4double currentKinEnergy;
G4double currentRange;
G4double rangeinit;
G4double currentRadLength;
G4double theta0max,rellossmax;
G4double third;
G4int currentMaterialIndex;
G4double y;
G4double Zold;
G4double Zeff,Z2,Z23,lnZ;
G4double coeffth1,coeffth2;
G4double coeffc1,coeffc2;
G4double scr1ini,scr2ini,scr1,scr2;
G4bool isInitialized;
G4bool inside;
G4bool insideskin;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4double G4UrbanMscModel92::GetLambda(G4double e)
{
G4double x;
if(theLambdaTable) {
G4bool b;
x = ((*theLambdaTable)[currentMaterialIndex])->GetValue(e, b);
} else {
x = CrossSection(couple,particle,e);
}
if(x > DBL_MIN) x = 1./x;
else x = DBL_MAX;
return x;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
void G4UrbanMscModel92::SetParticle(const G4ParticleDefinition* p)
{
if (p != particle) {
particle = p;
mass = p->GetPDGMass();
charge = p->GetPDGCharge()/eplus;
ChargeSquare = charge*charge;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
void G4UrbanMscModel92::UpdateCache()
{
lnZ = std::log(Zeff);
coeffth1 = 0.885+lnZ*(0.104-0.0170*lnZ);
coeffth2 = 0.028+lnZ*(0.012-0.00125*lnZ);
coeffc1 = 2.134-lnZ*(0.1045-0.00602*lnZ);
coeffc2 = 0.001126-lnZ*(0.0001089+0.0000247*lnZ);
Z2 = Zeff*Zeff;
Z23 = std::exp(2.*lnZ/3.);
scr1 = scr1ini*Z23;
scr2 = scr2ini*Z2*ChargeSquare;
// lastMaterial = couple->GetMaterial();
Zold = Zeff;
}
#endif
@@ -0,0 +1,235 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4UrbanMscModel93.hh,v 1.1 2009/11/01 13:04:12 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
//
// GEANT4 Class header file
//
//
// File name: G4UrbanMscModel93
//
// Author: Laszlo Urban
//
// Creation date: 06.03.2008
//
// Modifications:
// 23-04-2009 L.Urban updated parameterization in UpdateCache method
// 28-10-2009 V.Ivanchenko moved G4UrbanMscModel2 to G4UrbanMscModel93,
// now it is a frozen version of the Urban model corresponding
// to g4 9.3
//
//
// Class Description:
//
// Implementation of the model of multiple scattering based on
// H.W.Lewis Phys Rev 78 (1950) 526 and L.Urban model
// -------------------------------------------------------------------
//
#ifndef G4UrbanMscModel93_h
#define G4UrbanMscModel93_h 1
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "G4VMscModel.hh"
#include "G4PhysicsTable.hh"
#include "G4MscStepLimitType.hh"
class G4ParticleChangeForMSC;
class G4SafetyHelper;
class G4LossTableManager;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4UrbanMscModel93 : public G4VMscModel
{
public:
G4UrbanMscModel93(const G4String& nam = "UrbanMsc93");
virtual ~G4UrbanMscModel93();
void Initialise(const G4ParticleDefinition*, const G4DataVector&);
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition* particle,
G4double KineticEnergy,
G4double AtomicNumber,
G4double AtomicWeight=0.,
G4double cut =0.,
G4double emax=DBL_MAX);
void SampleScattering(const G4DynamicParticle*,
G4double safety);
G4double ComputeTruePathLengthLimit(const G4Track& track,
G4PhysicsTable* theLambdaTable,
G4double currentMinimalStep);
G4double ComputeGeomPathLength(G4double truePathLength);
G4double ComputeTrueStepLength(G4double geomStepLength);
G4double ComputeTheta0(G4double truePathLength,
G4double KineticEnergy);
private:
G4double SimpleScattering(G4double xmeanth, G4double x2meanth);
G4double SampleCosineTheta(G4double trueStepLength, G4double KineticEnergy);
G4double SampleDisplacement();
G4double LatCorrelation();
inline G4double GetLambda(G4double kinEnergy);
inline void SetParticle(const G4ParticleDefinition*);
inline void UpdateCache();
// hide assignment operator
G4UrbanMscModel93 & operator=(const G4UrbanMscModel93 &right);
G4UrbanMscModel93(const G4UrbanMscModel93&);
const G4ParticleDefinition* particle;
G4ParticleChangeForMSC* fParticleChange;
G4PhysicsTable* theLambdaTable;
const G4MaterialCutsCouple* couple;
G4LossTableManager* theManager;
G4double mass;
G4double charge,ChargeSquare;
G4double masslimite,lambdalimit,fr;
G4double taubig;
G4double tausmall;
G4double taulim;
G4double currentTau;
G4double tlimit;
G4double tlimitmin;
G4double tlimitminfix;
G4double tgeom;
G4double geombig;
G4double geommin;
G4double geomlimit;
G4double skindepth;
G4double smallstep;
G4double presafety;
G4double lambda0;
G4double lambdaeff;
G4double tPathLength;
G4double zPathLength;
G4double par1,par2,par3;
G4double stepmin;
G4double currentKinEnergy;
G4double currentRange;
G4double rangeinit;
G4double currentRadLength;
G4double theta0max,rellossmax;
G4double third;
G4int currentMaterialIndex;
G4double y;
G4double Zold;
G4double Zeff,Z2,Z23,lnZ;
G4double coeffth1,coeffth2;
G4double coeffc1,coeffc2;
G4double scr1ini,scr2ini,scr1,scr2;
G4bool isInitialized;
G4bool inside;
G4bool insideskin;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4double G4UrbanMscModel93::GetLambda(G4double e)
{
G4double x;
if(theLambdaTable) {
G4bool b;
x = ((*theLambdaTable)[currentMaterialIndex])->GetValue(e, b);
} else {
x = CrossSection(couple,particle,e);
}
if(x > DBL_MIN) x = 1./x;
else x = DBL_MAX;
return x;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
void G4UrbanMscModel93::SetParticle(const G4ParticleDefinition* p)
{
if (p != particle) {
particle = p;
mass = p->GetPDGMass();
charge = p->GetPDGCharge()/eplus;
ChargeSquare = charge*charge;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
void G4UrbanMscModel93::UpdateCache()
{
lnZ = std::log(Zeff);
//new correction in theta0 formula
coeffth1 = (1.-8.7780e-2/Zeff)*(0.87+0.03*lnZ);
coeffth2 = (4.0780e-2+1.7315e-4*Zeff)*(0.87+0.03*lnZ);
// tail parameters
G4double lnZ1 = std::log(Zeff+1.);
coeffc1 = 2.943-0.197*lnZ1;
coeffc2 = 0.0987-0.0143*lnZ1;
// for single scattering
Z2 = Zeff*Zeff;
Z23 = std::exp(2.*lnZ/3.);
scr1 = scr1ini*Z23;
scr2 = scr2ini*Z2*ChargeSquare;
Zold = Zeff;
}
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4WaterStopping.hh,v 1.6 2008/09/09 09:30:58 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4WaterStopping.hh,v 1.7 2009/06/19 10:39:48 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
#ifndef G4WaterStopping_h
#define G4WaterStopping_h 1
@@ -76,8 +76,8 @@ private:
G4WaterStopping(const G4WaterStopping&);
G4bool spline;
G4int Z[16];
G4double A[16];
G4int Z[17];
G4double A[17];
std::vector<G4LPhysicsFreeVector*> dedx;
};
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4WentzelVIModel.hh,v 1.7 2008/08/04 08:49:09 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4WentzelVIModel.hh,v 1.21 2009/10/10 15:16:57 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -65,7 +65,6 @@
class G4LossTableManager;
class G4ParticleChangeForMSC;
class G4SafetyHelper;
class G4ParticleDefinition;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -79,34 +78,28 @@ public:
virtual ~G4WentzelVIModel();
void Initialise(const G4ParticleDefinition*, const G4DataVector&);
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition*,
G4double KineticEnergy,
G4double AtomicNumber,
G4double AtomicWeight=0.,
G4double cut = DBL_MAX,
G4double emax= DBL_MAX);
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition*,
G4double KineticEnergy,
G4double AtomicNumber,
G4double AtomicWeight=0.,
G4double cut = DBL_MAX,
G4double emax= DBL_MAX);
void SampleScattering(const G4DynamicParticle*, G4double safety);
virtual void SampleScattering(const G4DynamicParticle*, G4double safety);
void SampleSecondaries(std::vector<G4DynamicParticle*>*,
const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double,
G4double);
virtual G4double ComputeTruePathLengthLimit(const G4Track& track,
G4PhysicsTable* theLambdaTable,
G4double currentMinimalStep);
G4double ComputeTruePathLengthLimit(const G4Track& track,
G4PhysicsTable* theLambdaTable,
G4double currentMinimalStep);
virtual G4double ComputeGeomPathLength(G4double truePathLength);
G4double ComputeGeomPathLength(G4double truePathLength);
G4double ComputeTrueStepLength(G4double geomStepLength);
virtual G4double ComputeTrueStepLength(G4double geomStepLength);
private:
G4double ComputeTransportXSectionPerVolume();
G4double ComputeTransportXSectionPerAtom();
G4double ComputeXSectionPerVolume();
@@ -132,7 +125,6 @@ private:
G4ParticleChangeForMSC* fParticleChange;
G4SafetyHelper* safetyHelper;
G4PhysicsTable* theLambdaTable;
G4PhysicsTable* theLambda2Table;
G4LossTableManager* theManager;
@@ -172,7 +164,6 @@ private:
// single scattering parameters
G4double coeff;
G4double constn;
G4double cosThetaMin;
G4double cosThetaMax;
G4double cosTetMaxNuc;
@@ -181,7 +172,6 @@ private:
G4double cosTetMaxElec2;
G4double q2Limit;
G4double alpha2;
G4double a0;
// projectile
const G4ParticleDefinition* particle;
@@ -192,14 +182,19 @@ private:
G4double tkin;
G4double mom2;
G4double invbeta2;
G4double kinFactor;
G4double etag;
G4double lowEnergyLimit;
// target
G4double targetZ;
G4double targetMass;
G4double screenZ;
G4double formfactA;
G4double FF[100];
G4int iz;
static G4double ScreenRSquare[100];
static G4double FormFactor[100];
// flags
G4bool isInitialized;
@@ -239,8 +234,7 @@ G4double G4WentzelVIModel::GetLambda(G4double e)
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline
void G4WentzelVIModel::SetupParticle(const G4ParticleDefinition* p)
inline void G4WentzelVIModel::SetupParticle(const G4ParticleDefinition* p)
{
// Initialise mass and charge
if(p != particle) {
@@ -250,7 +244,6 @@ void G4WentzelVIModel::SetupParticle(const G4ParticleDefinition* p)
G4double q = particle->GetPDGCharge()/eplus;
chargeSquare = q*q;
tkin = 0.0;
lowEnergyLimit = keV*mass/electron_mass_c2;
}
}
@@ -263,7 +256,7 @@ inline void G4WentzelVIModel::SetupKinematic(G4double ekin, G4double cut)
mom2 = tkin*(tkin + 2.0*mass);
invbeta2 = 1.0 + mass*mass/mom2;
cosTetMaxNuc = cosThetaMax;
if(ekin <= 10.*cut && mass < MeV) {
if(mass < MeV && ekin <= 10.*cut) {
cosTetMaxNuc = ekin*(cosThetaMax + 1.0)/(10.*cut) - 1.0;
}
ComputeMaxElectronScattering(cut);
@@ -277,28 +270,16 @@ inline void G4WentzelVIModel::SetupTarget(G4double Z, G4double e)
if(Z != targetZ || e != etag) {
etag = e;
targetZ = Z;
G4int iz= G4int(Z);
iz = G4int(Z);
if(iz > 99) iz = 99;
G4double x = fNistManager->GetZ13(iz);
screenZ = a0*x*x/mom2;
if(iz > 1) screenZ *=(1.13 + 3.76*invbeta2*Z*Z*chargeSquare*alpha2);
// screenZ = a0*x*x*(1.13 + 3.76*Z*Z*chargeSquare*alpha2)/mom2;
// A.V. Butkevich et al., NIM A 488 (2002) 282
formfactA = FF[iz];
if(formfactA == 0.0) {
x = fNistManager->GetA27(iz);
formfactA = constn*x*x;
FF[iz] = formfactA;
}
formfactA *= mom2;
targetMass = fNistManager->GetAtomicMassAmu(iz)*amu_c2;
screenZ = ScreenRSquare[iz]/mom2;
G4double meff = targetMass/(mass+targetMass);
kinFactor = coeff*targetZ*chargeSquare*invbeta2/(mom2*meff*meff);
screenZ *=(1.13 + std::min(1.0,3.76*Z*Z*invbeta2*alpha2));
if(mass > MeV) { screenZ *= 2.0; }
formfactA = FormFactor[iz]*mom2;
cosTetMaxNuc2 = cosTetMaxNuc;
/*
G4double ee = 10.*eV*Z;
if(1 == iz) ee *= 2.0;
G4double z = std::min(cosTetMaxElec, 1.0 - std::max(ecut,ee)*amu_c2
*fNistManager->GetAtomicMassAmu(iz)/mom2);
cosTetMaxElec2 = std::max(cosTetMaxNuc2, z);
*/
cosTetMaxElec2 = cosTetMaxElec;
}
}
@@ -0,0 +1,127 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4alphaIonisation.hh,v 1.1 2009/11/10 11:50:30 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
//
// File name: G4alphaIonisation
//
// Author: Vladimir Ivanchenko
//
// Creation date: 28.10.2009
//
// Modifications:
//
//
// Class Description:
//
// This class manages the ionisation process for He ions. Effective charge,
// nuclear stopping power, energy loss corrections are taken into account.
// It inherites from G4VEnergyLossLoss.
//
// -------------------------------------------------------------------
//
#ifndef G4alphaIonisation_h
#define G4alphaIonisation_h 1
#include "G4VEnergyLossProcess.hh"
class G4Material;
class G4alphaIonisation : public G4VEnergyLossProcess
{
public:
G4alphaIonisation(const G4String& name = "alphaIoni");
virtual ~G4alphaIonisation();
virtual G4bool IsApplicable(const G4ParticleDefinition& p);
// Print out of the class parameters
virtual void PrintInfo();
void ActivateNuclearStopping(G4bool);
protected:
virtual void InitialiseEnergyLossProcess(const G4ParticleDefinition*,
const G4ParticleDefinition*);
virtual G4double MinPrimaryEnergy(const G4ParticleDefinition* p,
const G4Material*, G4double cut);
inline G4double BetheBlochEnergyThreshold();
inline G4bool NuclearStoppingFlag();
private:
// hide assignment operator
G4alphaIonisation & operator=(const G4alphaIonisation &right);
G4alphaIonisation(const G4alphaIonisation&);
const G4ParticleDefinition* theParticle;
G4double mass;
G4double ratio;
G4double eth;
G4bool isInitialised;
G4bool nuclearStopping;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4alphaIonisation::ActivateNuclearStopping(G4bool val)
{
nuclearStopping = val;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4alphaIonisation::BetheBlochEnergyThreshold()
{
return eth;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4bool G4alphaIonisation::NuclearStoppingFlag()
{
return nuclearStopping;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4eBremsstrahlung.hh,v 1.36 2007/05/23 08:47:34 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4eBremsstrahlung.hh,v 1.37 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -88,7 +88,7 @@ public:
virtual ~G4eBremsstrahlung();
G4bool IsApplicable(const G4ParticleDefinition& p);
virtual G4bool IsApplicable(const G4ParticleDefinition& p);
// Print out of the class parameters
virtual void PrintInfo();
@@ -109,14 +109,6 @@ private:
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4bool G4eBremsstrahlung::IsApplicable(const G4ParticleDefinition& p)
{
return (&p == G4Electron::Electron() || &p == G4Positron::Positron());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4eBremsstrahlungModel.hh,v 1.25 2008/11/13 19:28:58 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4eBremsstrahlungModel.hh,v 1.26 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -74,8 +74,8 @@ public:
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
G4double MinEnergyCut(const G4ParticleDefinition*,
const G4MaterialCutsCouple*);
virtual G4double MinEnergyCut(const G4ParticleDefinition*,
const G4MaterialCutsCouple*);
virtual G4double ComputeDEDXPerVolume(const G4Material*,
const G4ParticleDefinition*,
@@ -102,9 +102,6 @@ public:
protected:
inline G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kineticEnergy);
const G4Element* SelectRandomAtom(const G4MaterialCutsCouple* couple);
private:
@@ -190,14 +187,4 @@ G4double G4eBremsstrahlungModel::ScreenFunction2(G4double ScreenVariable)
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline
G4double G4eBremsstrahlungModel::MaxSecondaryEnergy(
const G4ParticleDefinition*,
G4double kineticEnergy)
{
return kineticEnergy;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4eBremsstrahlungRelModel.hh,v 1.10 2008/11/14 09:25:19 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4eBremsstrahlungRelModel.hh,v 1.11 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -70,8 +70,8 @@ public:
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
G4double MinEnergyCut(const G4ParticleDefinition*,
const G4MaterialCutsCouple*);
virtual G4double MinEnergyCut(const G4ParticleDefinition*,
const G4MaterialCutsCouple*);
virtual G4double ComputeDEDXPerVolume(const G4Material*,
const G4ParticleDefinition*,
@@ -96,11 +96,6 @@ public:
inline void SetLPMconstant(G4double val);
inline G4double LPMconstant() const;
protected:
inline G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kineticEnergy);
private:
void InitialiseConstants();
@@ -206,15 +201,6 @@ inline void G4eBremsstrahlungRelModel::SetCurrentElement(const G4double Z)
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double
G4eBremsstrahlungRelModel::MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kineticEnergy)
{
return kineticEnergy;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4eBremsstrahlungRelModel::Phi1(G4double gg, G4double)
{
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4eCoulombScatteringModel.hh,v 1.36 2008/08/04 08:49:09 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4eCoulombScatteringModel.hh,v 1.49 2009/10/10 15:16:57 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -45,6 +45,8 @@
// make some members protected
// 09.10.07 V.Ivanchenko reorganized methods, add cut dependence in scattering off e-
// 09.06.08 V.Ivanchenko add SelectIsotope and sampling of the recoil ion
// 17.06.09 C.Consoalndi modified SetupTarget method - remove kinFactor
//
//
// Class Description:
//
@@ -64,8 +66,9 @@
#include "G4VEmModel.hh"
#include "G4PhysicsTable.hh"
#include "G4NistManager.hh"
#include "globals.hh"
#include "G4NistManager.hh"
#include <vector>
class G4ParticleChangeForGamma;
class G4ParticleDefinition;
@@ -128,7 +131,8 @@ protected:
G4ParticleTable* theParticleTable;
G4ParticleChangeForGamma* fParticleChange;
G4NistManager* fNistManager;
const G4DataVector* currentCuts;
const std::vector<G4double>* pCuts;
const G4MaterialCutsCouple* currentCouple;
const G4Material* currentMaterial;
@@ -136,7 +140,6 @@ protected:
G4int currentMaterialIndex;
G4double coeff;
G4double constn;
G4double cosThetaMin;
G4double cosThetaMax;
G4double cosTetMinNuc;
@@ -164,16 +167,19 @@ protected:
// target
G4double targetZ;
G4double targetMass;
G4double screenZ;
G4double formfactA;
G4int idxelm;
G4int iz;
private:
G4double a0;
G4double alpha2;
G4double faclim;
G4double FF[100];
static G4double ScreenRSquare[100];
static G4double FormFactor[100];
G4bool isInitialised;
};
@@ -203,7 +209,6 @@ void G4eCoulombScatteringModel::SetupParticle(const G4ParticleDefinition* p)
G4double q = particle->GetPDGCharge()/eplus;
chargeSquare = q*q;
tkin = 0.0;
lowEnergyLimit = keV*mass/electron_mass_c2;
}
}
@@ -218,7 +223,7 @@ inline void G4eCoulombScatteringModel::SetupKinematic(G4double ekin,
invbeta2 = 1.0 + mass*mass/mom2;
cosTetMinNuc = cosThetaMin;
cosTetMaxNuc = cosThetaMax;
if(ekin <= 10.*cut && mass < MeV && cosThetaMin < 1.0) {
if(mass < MeV && cosThetaMin < 1.0 && ekin <= 10.*cut) {
cosTetMinNuc = ekin*(cosThetaMin + 1.0)/(10.*cut) - 1.0;
}
ComputeMaxElectronScattering(cut);
@@ -232,31 +237,17 @@ inline void G4eCoulombScatteringModel::SetupTarget(G4double Z, G4double e)
if(Z != targetZ || e != etag) {
etag = e;
targetZ = Z;
G4int iz= G4int(Z);
iz= G4int(Z);
if(iz > 99) iz = 99;
G4double x = fNistManager->GetZ13(iz);
screenZ = a0*x*x/mom2;
if(iz > 1) screenZ *=(1.13 + 3.76*invbeta2*Z*Z*chargeSquare*alpha2);
//screenZ = a0*x*x*(1.13 + 3.76*Z*Z*chargeSquare*alpha2)/mom2;
// A.V. Butkevich et al., NIM A 488 (2002) 282
formfactA = FF[iz];
if(formfactA == 0.0) {
x = fNistManager->GetA27(iz);
formfactA = constn*x*x;
FF[iz] = formfactA;
}
formfactA *= mom2;
targetMass = fNistManager->GetAtomicMassAmu(iz)*amu_c2;
screenZ = ScreenRSquare[iz]/mom2;
screenZ *=(1.13 + std::min(1.0,3.76*Z*Z*invbeta2*alpha2));
if(mass > MeV) { screenZ *= 2.0; }
formfactA = FormFactor[iz]*mom2;
cosTetMaxNuc2 = cosTetMaxNuc;
if(particle == theProton && 1 == iz && cosTetMaxNuc2 < 0.0) {
if(1 == iz && particle == theProton && cosTetMaxNuc2 < 0.0) {
cosTetMaxNuc2 = 0.0;
}
/*
G4double ee = 10.*eV*Z;
if(1 == iz) ee *= 2.0;
G4double z = std::min(cosTetMaxElec, 1.0 - std::max(ecut,ee)*amu_c2
*fNistManager->GetAtomicMassAmu(iz)/mom2);
cosTetMaxElec2 = std::max(cosTetMaxNuc2, z);
*/
cosTetMaxElec2 = cosTetMaxElec;
}
}
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4eIonisation.hh,v 1.35 2007/05/23 08:47:34 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4eIonisation.hh,v 1.36 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -87,7 +87,7 @@ public:
virtual ~G4eIonisation();
G4bool IsApplicable(const G4ParticleDefinition& p);
virtual G4bool IsApplicable(const G4ParticleDefinition& p);
// Print out of the class parameters
virtual void PrintInfo();
@@ -97,8 +97,8 @@ protected:
virtual void InitialiseEnergyLossProcess(const G4ParticleDefinition*,
const G4ParticleDefinition*);
G4double MinPrimaryEnergy(const G4ParticleDefinition*,
const G4Material*, G4double cut);
virtual G4double MinPrimaryEnergy(const G4ParticleDefinition*,
const G4Material*, G4double cut);
private:
@@ -113,25 +113,6 @@ private:
G4bool isInitialised;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4eIonisation::MinPrimaryEnergy(const G4ParticleDefinition*,
const G4Material*,
G4double cut)
{
G4double x = cut;
if(isElectron) x += cut;
return x;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4bool G4eIonisation::IsApplicable(const G4ParticleDefinition& p)
{
return (&p == G4Electron::Electron() || &p == G4Positron::Positron());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4eMultipleScattering.hh,v 1.2 2008/03/11 12:03:43 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4eMultipleScattering.hh,v 1.3 2009/11/01 13:04:12 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -----------------------------------------------------------------------------
//
@@ -58,8 +58,6 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4VMscModel;
class G4eMultipleScattering : public G4VMultipleScattering
{
@@ -91,8 +89,6 @@ protected:
private: // data members
G4VMscModel* mscUrban;
G4double lambdalimit;
G4double dtrl;
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4eplusAnnihilation.hh,v 1.23 2007/05/23 08:47:34 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4eplusAnnihilation.hh,v 1.24 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -72,13 +72,13 @@ public:
virtual ~G4eplusAnnihilation();
G4bool IsApplicable(const G4ParticleDefinition& p);
virtual G4bool IsApplicable(const G4ParticleDefinition& p);
virtual G4VParticleChange* AtRestDoIt(
const G4Track& track,
const G4Step& stepData);
G4double AtRestGetPhysicalInteractionLength(
virtual G4double AtRestGetPhysicalInteractionLength(
const G4Track& track,
G4ForceCondition* condition
);
@@ -95,24 +95,6 @@ private:
G4bool isInitialised;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4bool G4eplusAnnihilation::IsApplicable(const G4ParticleDefinition& p)
{
return (&p == G4Positron::Positron());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline
G4double G4eplusAnnihilation::AtRestGetPhysicalInteractionLength(
const G4Track&, G4ForceCondition* condition)
{
*condition = NotForced;
return 0.0;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4hIonisation.hh,v 1.41 2008/09/14 17:11:48 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4hIonisation.hh,v 1.42 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -92,10 +92,10 @@ public:
virtual ~G4hIonisation();
G4bool IsApplicable(const G4ParticleDefinition& p);
virtual G4bool IsApplicable(const G4ParticleDefinition& p);
G4double MinPrimaryEnergy(const G4ParticleDefinition* p,
const G4Material*, G4double cut);
virtual G4double MinPrimaryEnergy(const G4ParticleDefinition* p,
const G4Material*, G4double cut);
// Print out of the class parameters
virtual void PrintInfo();
@@ -121,26 +121,6 @@ private:
G4double eth;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4bool G4hIonisation::IsApplicable(const G4ParticleDefinition& p)
{
return (p.GetPDGCharge() != 0.0 && p.GetPDGMass() > 10.0*MeV &&
!p.IsShortLived());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4hIonisation::MinPrimaryEnergy(const G4ParticleDefinition*,
const G4Material*,
G4double cut)
{
G4double x = 0.5*cut/electron_mass_c2;
G4double g = x*ratio + std::sqrt((1. + x)*(1. + x*ratio*ratio));
return mass*(g - 1.0);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4hIonisation::ActivateNuclearStopping(G4bool val)
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4hMultipleScattering.hh,v 1.6 2008/05/09 08:23:44 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4hMultipleScattering.hh,v 1.8 2009/11/01 13:04:12 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -----------------------------------------------------------------------------
//
@@ -38,6 +38,7 @@
//
// Modifications:
// 20.03.07 Remove local parameter skin (V.Ivanchenko)
// 04.07.09 Remove other local parameters (V.Ivanchenko)
//
//
//------------------------------------------------------------------------------
@@ -59,8 +60,6 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4VMscModel;
class G4hMultipleScattering : public G4VMultipleScattering
{
@@ -76,25 +75,6 @@ public: // with description
// Print few lines of informations about the process: validity range,
void PrintInfo();
// geom. step length distribution should be sampled or not
void Setsamplez(G4bool value) { samplez = value;};
// to reduce the energy/step dependence
void Setdtrl(G4double value) { dtrl = value;};
// 'soften' step limitation above lambdalimit
void SetLambdalimit(G4double value) { lambdalimit = value;};
// The function overloads the corresponding function of the base
// class.It limits the step near to boundaries only
// and invokes the method GetMscContinuousStepLimit at every step.
G4double AlongStepGetPhysicalInteractionLength(
const G4Track&,
G4double previousStepSize,
G4double currentMinimalStep,
G4double& currentSafety,
G4GPILSelection* selection);
protected:
// This function initialise models
@@ -102,14 +82,7 @@ protected:
private: // data members
G4VMscModel* mscUrban;
G4double lambdalimit;
G4double dtrl;
G4bool samplez;
G4bool isInitialized;
G4bool isIon;
};
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4ionIonisation.hh,v 1.56 2008/09/14 17:11:48 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4ionIonisation.hh,v 1.57 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
@@ -84,7 +84,7 @@ public:
virtual ~G4ionIonisation();
inline G4bool IsApplicable(const G4ParticleDefinition& p);
virtual G4bool IsApplicable(const G4ParticleDefinition& p);
// Print out of the class parameters
virtual void PrintInfo();
@@ -101,7 +101,7 @@ protected:
virtual void InitialiseEnergyLossProcess(const G4ParticleDefinition*,
const G4ParticleDefinition*);
inline G4double MinPrimaryEnergy(const G4ParticleDefinition* p,
virtual G4double MinPrimaryEnergy(const G4ParticleDefinition* p,
const G4Material*, G4double cut);
inline G4double BetheBlochEnergyThreshold();
@@ -128,23 +128,6 @@ private:
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4bool G4ionIonisation::IsApplicable(const G4ParticleDefinition& p)
{
return (p.GetPDGCharge() != 0.0 && !p.IsShortLived() &&
p.GetParticleType() == "nucleus");
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4ionIonisation::MinPrimaryEnergy(
const G4ParticleDefinition* p, const G4Material*, G4double cut)
{
return
p->GetPDGMass()*(std::sqrt(1. + 0.5*cut/CLHEP::electron_mass_c2) - 1.0);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4ionIonisation::ActivateStoppingData(G4bool val)
{
stopDataActive = val;