Import Geant4 9.4.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-09 16:25:56 +02:00
parent 74cad5e589
commit 89a9605df1
4440 changed files with 379508 additions and 189225 deletions
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4ASTARStopping.hh,v 1.6 2008/11/13 12:04:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4ASTARStopping.hh,v 1.8 2010/04/26 17:22:08 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
#ifndef G4ASTARStopping_h
#define G4ASTARStopping_h 1
@@ -54,6 +54,8 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "globals.hh"
#include "G4LPhysicsFreeVector.hh"
#include <vector>
class G4Material;
@@ -75,16 +77,18 @@ private:
void Initialise();
void AddData(G4double* e, G4double* s, G4int idx);
// hide assignment operator
G4ASTARStopping & operator=(const G4ASTARStopping &right);
G4ASTARStopping(const G4ASTARStopping&);
G4int matIndex;
const G4Material* currentMaterial;
G4int index, matIndex;
G4String name[74];
G4double currentE, res;
G4double e[74][78], kinE[78];
G4double effZ[74];
G4double emin;
std::vector<G4String> name;
std::vector<G4double> effZ;
std::vector<G4LPhysicsFreeVector*> sdata;
};
inline G4double G4ASTARStopping::GetElectronicDEDX(const G4Material* mat,
@@ -96,6 +100,6 @@ inline G4double G4ASTARStopping::GetElectronicDEDX(const G4Material* mat,
inline G4double G4ASTARStopping::GetEffectiveZ(G4int idx)
{
return effZ[idx];
}
}
#endif
@@ -23,56 +23,59 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BetheBlochIonGasModel.hh,v 1.1 2010/05/27 10:34:09 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
//
// $Id: G4PolarizedComptonScattering.hh,v 1.9 2006/06/29 19:51:14 gunter Exp $
// GEANT4 tag $Name: geant4-09-02 $
// -------------------------------------------------------------------
//
// --------- G4PolarizedComptonScattering physics process ----------------------
// by Vicente Lara, March 1998
// GEANT4 Class header file
//
// -----------------------------------------------------------------------------
//
// File name: G4BetheBlochIonGasModel
//
// Author: Vladimir Ivanchenko
//
// Creation date: 20.05.2010
//
// Modifications:
//
// Class Description:
//
// Implementation of Bethe-Bloch model energy loss and delta-electron production
// by heavy positive partially stripted ion. Effective charge is not used,
// dynamic charge should be sampled by a dedicated charge exchange process
// class description
//
// inherit from G4ComptonScattering
// -------------------------------------------------------------------
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#ifndef G4BetheBlochIonGasModel_h
#define G4BetheBlochIonGasModel_h 1
#ifndef G4PolarizedComptonScattering_h
#define G4PolarizedComptonScattering_h 1
#include "G4BetheBlochModel.hh"
#include "G4ComptonScattering52.hh"
#include "G4EnergyLossTables.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4PolarizedComptonScattering : public G4ComptonScattering52
class G4BetheBlochIonGasModel : public G4BetheBlochModel
{
public: // with description
G4PolarizedComptonScattering(const G4String& processName = "polarCompt");
public:
G4VParticleChange* PostStepDoIt(const G4Track& aTrack, const G4Step& aStep);
G4BetheBlochIonGasModel(const G4ParticleDefinition* p = 0,
const G4String& nam = "BetheBlochGasIon");
private:
G4ThreeVector SetNewPolarization(G4double, G4double,
G4double, G4double,
G4ThreeVector& );
virtual ~G4BetheBlochIonGasModel();
G4double SetPhi(G4double, G4double, G4double, G4double);
virtual G4double ChargeSquareRatio(const G4Track& track);
virtual G4double GetParticleCharge(const G4ParticleDefinition* p,
const G4Material* mat,
G4double kineticEnergy);
void SystemOfRefChange(G4ThreeVector&, G4ThreeVector&, G4ThreeVector&,
G4ThreeVector&);
private:
// hide assignment operator as private
G4PolarizedComptonScattering& operator=(const G4PolarizedComptonScattering &right);
G4PolarizedComptonScattering(const G4PolarizedComptonScattering& );
// hide assignment operator
G4BetheBlochIonGasModel & operator=(const G4BetheBlochIonGasModel &right);
G4BetheBlochIonGasModel(const G4BetheBlochIonGasModel&);
G4double currentCharge;
};
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BetheBlochModel.hh,v 1.20 2009/04/23 17:44:43 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4BetheBlochModel.hh,v 1.23 2010/05/27 14:26:17 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
//
// -------------------------------------------------------------------
//
@@ -115,10 +115,10 @@ public:
const G4Material* mat,
G4double kineticEnergy);
virtual void CorrectionsAlongStep(const G4MaterialCutsCouple*,
const G4DynamicParticle*,
virtual void CorrectionsAlongStep(const G4MaterialCutsCouple* couple,
const G4DynamicParticle* dp,
G4double& eloss,
G4double& niel,
G4double&,
G4double length);
virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
@@ -132,9 +132,13 @@ protected:
virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kinEnergy);
inline G4double GetChargeSquareRatio() const;
inline void SetChargeSquareRatio(G4double val);
private:
inline void SetupParameters();
void SetupParameters();
inline void SetParticle(const G4ParticleDefinition* p);
@@ -168,35 +172,12 @@ private:
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4BetheBlochModel::SetupParameters()
{
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;
if (p->GetPDGCharge()/eplus > 1.5 && p->GetBaryonNumber() > 2)
{ isIon = true; }
SetupParameters();
}
}
@@ -205,9 +186,25 @@ inline void G4BetheBlochModel::SetParticle(const G4ParticleDefinition* p)
inline void G4BetheBlochModel::SetGenericIon(const G4ParticleDefinition* p)
{
if(p && particle != p) {
if(p->GetParticleName() == "GenericIon") isIon = true;
if(p && particle != p) {
if(p->GetParticleName() == "GenericIon") { isIon = true; }
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4BetheBlochModel::GetChargeSquareRatio() const
{
return chargeSquare;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4BetheBlochModel::SetChargeSquareRatio(G4double val)
{
chargeSquare = val;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BetheHeitlerModel.hh,v 1.6 2007/05/22 17:34:36 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4BetheHeitlerModel.hh,v 1.9 2010/10/26 10:35:22 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -------------------------------------------------------------------
//
@@ -62,7 +62,7 @@ class G4BetheHeitlerModel : public G4VEmModel
public:
G4BetheHeitlerModel(const G4ParticleDefinition* p = 0,
const G4String& nam = "Bethe-Heitler");
const G4String& nam = "BetheHeitler");
virtual ~G4BetheHeitlerModel();
@@ -96,14 +96,6 @@ private:
G4ParticleDefinition* theElectron;
G4ParticleDefinition* thePositron;
G4ParticleChangeForGamma* fParticleChange;
G4PhysicsTable* theCrossSectionTable;
G4double lowGammaEnergy;
G4double highGammaEnergy;
G4int nbins;
size_t indexZ[120];
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
@@ -0,0 +1,85 @@
//
// ********************************************************************
// * 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: G4BraggIonGasModel.hh,v 1.1 2010/05/27 10:34:09 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
//
// File name: G4BraggIonGasModel
//
// Author: Vladimir Ivanchenko
//
// Creation date: 20.05.2010
//
// Modifications:
//
// Class Description:
//
// Implementation of energy loss using and delta-electron production
// by heavy positive partially stripted ion using G4BraggModel. Effective
// charge of ion is not used, dynamic charge should be sampled by a
// dedicated charge exchange process
//
// -------------------------------------------------------------------
//
#ifndef G4BraggIonGasModel_h
#define G4BraggIonGasModel_h 1
#include "G4BraggModel.hh"
class G4BraggIonGasModel : public G4BraggModel
{
public:
G4BraggIonGasModel(const G4ParticleDefinition* p = 0,
const G4String& nam = "BraggIonGas");
virtual ~G4BraggIonGasModel();
// Access ion effective charge square ratio to unit charge
virtual G4double ChargeSquareRatio(const G4Track&);
// Access ion effective charge
virtual G4double GetParticleCharge(const G4ParticleDefinition*,
const G4Material* mat,
G4double kineticEnergy);
private:
// hide assignment operator
G4BraggIonGasModel & operator=(const G4BraggIonGasModel &right);
G4BraggIonGasModel(const G4BraggIonGasModel&);
G4double currentCharge;
};
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4BraggModel.hh,v 1.14 2009/11/10 19:25:47 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4BraggModel.hh,v 1.15 2010/05/27 10:08:58 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
//
// -------------------------------------------------------------------
//
@@ -120,20 +120,16 @@ 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:
virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kinEnergy);
inline G4double GetChargeSquareRatio() const;
inline void SetChargeSquareRatio(G4double val);
private:
inline void SetParticle(const G4ParticleDefinition* p);
@@ -196,6 +192,16 @@ inline void G4BraggModel::SetParticle(const G4ParticleDefinition* p)
ratio = electron_mass_c2/mass;
}
inline G4double G4BraggModel::GetChargeSquareRatio() const
{
return chargeSquare;
}
inline void G4BraggModel::SetChargeSquareRatio(G4double val)
{
chargeSquare = val;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -1,162 +0,0 @@
//
// ********************************************************************
// * 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: G4ComptonScattering52.hh,v 1.4 2007/05/16 14:00:56 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
//
//------------------ G4ComptonScattering52 physics process -----------------------
// by Michel Maire, April 1996
//
// 10-06-96, updated by M.Maire
// 21-06-96, SetCuts implementation, M.Maire
// 06-01-97, crossection table + meanfreepath table, M.Maire
// 17-02-97, New Physics scheme
// 25-02-97, GetMeanFreePath() now is public function
// 12-03-97, new physics scheme again
// 13-08-98, new methods SetBining() PrintInfo()
// 03-08-01, new methods Store/Retrieve PhysicsTable (mma)
// 06-08-01, BuildThePhysicsTable() called from constructor (mma)
// 19-09-01, come back to previous ProcessName "compt"
// 20-09-01, DoIt: fminimalEnergy = 1*eV (mma)
// 01-10-01, come back to BuildPhysicsTable(const G4ParticleDefinition&)
// 13-08-04, suppress icc file; make public ComputeCrossSectionPerAtom() (mma)
// 09-11-04, Remove Retrieve tables (V.Ivantchenko)
// 04-05-05, Add 52 to class name (V.Ivanchenko)
// -----------------------------------------------------------------------------
// class description
//
// inherit from G4VDiscreteProcess
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#ifndef G4ComptonScattering52_h
#define G4ComptonScattering52_h 1
#include "G4ios.hh"
#include "globals.hh"
#include "Randomize.hh"
#include "G4VDiscreteProcess.hh"
#include "G4PhysicsTable.hh"
#include "G4PhysicsLogVector.hh"
#include "G4Element.hh"
#include "G4Gamma.hh"
#include "G4Electron.hh"
#include "G4Step.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4ComptonScattering52 : public G4VDiscreteProcess
{
public: // with description
G4ComptonScattering52(const G4String& processName ="compt",
G4ProcessType type = fElectromagnetic);
~G4ComptonScattering52();
G4bool IsApplicable(const G4ParticleDefinition&);
// true for Gamma only.
void SetPhysicsTableBining(G4double lowE, G4double highE, G4int nBins);
// Allows to define the binning of the PhysicsTables,
// before to build them.
void BuildPhysicsTable(const G4ParticleDefinition&);
// It builds the total CrossSectionPerAtom table, for Gamma,
// and for every element contained in the elementTable.
// It builds the MeanFreePath table, for Gamma,
// and for every material contained in the materialTable.
G4bool StorePhysicsTable(const G4ParticleDefinition* ,
const G4String& directory, G4bool);
// store CrossSection and MeanFreePath tables into an external file
// specified by 'directory' (must exist before invokation)
//G4bool RetrievePhysicsTable(const G4ParticleDefinition* ,
// const G4String& directory, G4bool);
// retrieve CrossSection and MeanFreePath tables from an external file
// specified by 'directory'
void PrintInfoDefinition();
// Print few lines of informations about the process: validity range,
// origine ..etc..
// Invoked by BuildThePhysicsTable().
G4double GetMeanFreePath(const G4Track& aTrack,
G4double previousStepSize,
G4ForceCondition* condition);
// It returns the MeanFreePath of the process for the current track :
// (energy, material)
// The previousStepSize and G4ForceCondition* are not used.
// This function overloads a virtual function of the base class.
// It is invoked by the ProcessManager of the Particle.
G4double GetCrossSectionPerAtom(G4DynamicParticle* aDynamicGamma,
G4Element* anElement);
// It returns the total CrossSectionPerAtom of the process,
// for the current DynamicGamma (energy), in anElement.
G4VParticleChange* PostStepDoIt(const G4Track& aTrack,
const G4Step& aStep);
// It computes the final state of the process (at end of step),
// returned as a ParticleChange object.
// This function overloads a virtual function of the base class.
// It is invoked by the ProcessManager of the Particle.
virtual
G4double ComputeCrossSectionPerAtom(G4double GammaEnergy,
G4double AtomicNumber);
G4double ComputeMeanFreePath(G4double GammaEnergy,
G4Material* aMaterial);
private:
// hide assignment operator as private
G4ComptonScattering52& operator=(const G4ComptonScattering52 &right);
G4ComptonScattering52(const G4ComptonScattering52& );
private:
G4PhysicsTable* theCrossSectionTable; // table for crosssection
G4PhysicsTable* theMeanFreePathTable; // table for mean free path
G4double LowestEnergyLimit; // low energy limit of the tables
G4double HighestEnergyLimit; // high energy limit of the tables
G4int NumbBinTable; // number of bins in the tables
protected:
G4double fminimalEnergy; // minimalEnergy of produced particles
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4CoulombScattering.hh,v 1.13 2009/05/07 18:41:45 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4CoulombScattering.hh,v 1.15 2010/10/25 19:13:23 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -------------------------------------------------------------------
//
@@ -73,9 +73,6 @@ public:
// Set energy above which high energy model will be used
inline void SetHEModelLimit(G4double);
// obsolete method to be removed
inline void SetBuildTableFlag(G4bool);
// Print out of the class parameters
virtual void PrintInfo();
@@ -95,7 +92,6 @@ private:
G4double thEnergy;
G4double thEnergyElec;
G4bool isInitialised;
G4bool buildElmTableFlag;
const G4ParticleDefinition* aParticle;
};
@@ -124,11 +120,6 @@ inline void G4CoulombScattering::SetQ2Max(G4double val)
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4CoulombScattering::SetBuildTableFlag(G4bool)
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4CoulombScattering::SetHEModelLimit(G4double val)
{
thEnergy = val;
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4CoulombScatteringModel.hh,v 1.15 2008/07/31 13:11:34 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4CoulombScatteringModel.hh,v 1.17 2010/05/27 14:22:05 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
//
// -------------------------------------------------------------------
//
@@ -44,6 +44,8 @@
// 19.10.06 V.Ivanchenko use inheritance from G4eCoulombScatteringModel
// 09.10.07 V.Ivanchenko reorganized methods, add cut dependence in scattering off e-
// 09.06.08 V.Ivanchenko SelectIsotope is moved to the base class
// 27.05.10 V.Ivanchenko added G4WentzelOKandVIxSection class to
// compute cross sections and sample scattering angle
//
// Class Description:
//
@@ -23,8 +23,8 @@
// * 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 $
// $Id: G4GoudsmitSaundersonMscModel.hh,v 1.5 2010/06/25 09:41:34 gunter Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
//
// -------------------------------------------------------------------
//
@@ -40,6 +40,7 @@
//
// Modifications:
// 04.03.2009 V.Ivanchenko cleanup and format according to Geant4 EM style
// 12.05.2010 O.Kadri: adding Qn1 and Qn12 as private doubles
//
// Class description:
//
@@ -53,7 +54,7 @@
//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.
//Ref.7:G4WentzelVIModel G4_v9.3.
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#ifndef G4GoudsmitSaundersonMscModel_h
@@ -62,7 +63,6 @@
#include "G4VMscModel.hh"
#include "G4PhysicsTable.hh"
#include "globals.hh"
#include "G4DataInterpolation.hh"
class G4DataVector;
class G4ParticleChangeForMSC;
@@ -113,8 +113,8 @@ private:
G4GoudsmitSaundersonMscModel & operator=(const G4GoudsmitSaundersonMscModel &right);
G4GoudsmitSaundersonMscModel(const G4GoudsmitSaundersonMscModel&);
G4double lowKEnergy;
G4double highKEnergy;
G4double lowKEnergy;
G4double highKEnergy;
G4double currentKinEnergy;
G4double currentRange;
@@ -124,9 +124,8 @@ private:
G4double tausmall,taulim,tlimit,tlimitmin,geommin,geombig;
G4double charge,lambdalimit;
G4double tPathLength,stepmin ;
G4double lambda1,lambda11;
G4double lambda0,lambda1,lambda11,Qn1,Qn12;
G4double mass;
G4double lambda0;
G4int currentMaterialIndex;
G4bool inside;
@@ -138,7 +137,6 @@ private:
G4LossTableManager* theManager;
const G4ParticleDefinition* particle;
G4ParticleChangeForMSC* fParticleChange;
G4DataInterpolation* MyValue;
const G4MaterialCutsCouple* currentCouple;
static G4double ener[106];
@@ -23,8 +23,8 @@
// * 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 $
// $Id: G4GoudsmitSaundersonTable.hh,v 1.5 2010/06/25 09:41:36 gunter Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
//
// -------------------------------------------------------------------
//
@@ -0,0 +1,258 @@
//
// ********************************************************************
// * 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: G4ICRU73QOModel.hh,v 1.3 2010/06/04 09:09:31 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
//
// File name: G4ICRU73QOModel
//
// Author: Alexander Bagulya
//
// Creation date: 21.05.2010
//
// Modifications:
//
//
// Class Description:
//
// Quantum Harmonic Oscillator Model for energy loss using atomic shell
// structure of atoms taking into account Q^2 (main for projectile charge Q),
// Q^3 and Q^4 terms for computation of energy loss due to binary collisions.
// Can be applied on heavy negatively charged particles for the energy interval
// 10 keV - 10 MeV scaled to the proton mass.
//
// Used data and formula of
// 1. G4QAOLowEnergyLoss class, S.Chauvie, P.Nieminen, M.G.Pia. IEEE Trans.
// Nucl. Sci. 54 (2007) 578.
// 2. ShellStrength and ShellEnergy from ICRU'73 Report 2005,
// 3. Data for Ta (Z=73) from P.Sigmund, A.Shinner. Eur. Phys. J. D15 (2001)
// 165-172
//
// -------------------------------------------------------------------
//
#ifndef G4ICRU73QOModel_h
#define G4ICRU73QOModel_h 1
#include "G4VEmModel.hh"
#include "G4AtomicShells.hh"
#include "G4DensityEffectData.hh"
class G4ParticleChangeForLoss;
class G4ICRU73QOModel : public G4VEmModel
{
public:
G4ICRU73QOModel(const G4ParticleDefinition* p = 0,
const G4String& nam = "ICRU73QO");
virtual ~G4ICRU73QOModel();
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
virtual G4double MinEnergyCut(const G4ParticleDefinition*,
const G4MaterialCutsCouple*);
virtual G4double ComputeCrossSectionPerElectron(
const G4ParticleDefinition*,
G4double kineticEnergy,
G4double cutEnergy,
G4double maxEnergy);
virtual G4double ComputeCrossSectionPerAtom(
const G4ParticleDefinition*,
G4double kineticEnergy,
G4double Z, G4double A,
G4double cutEnergy,
G4double maxEnergy);
virtual G4double CrossSectionPerVolume(const G4Material*,
const G4ParticleDefinition*,
G4double kineticEnergy,
G4double cutEnergy,
G4double maxEnergy);
virtual G4double ComputeDEDXPerVolume(const G4Material*,
const G4ParticleDefinition*,
G4double kineticEnergy,
G4double);
virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double tmin,
G4double maxEnergy);
// 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:
virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kinEnergy);
private:
inline void SetParticle(const G4ParticleDefinition* p);
inline void SetLowestKinEnergy(const G4double val);
G4double DEDX(const G4Material* material, G4double kineticEnergy);
G4double DEDXPerElement(G4int Z, G4double kineticEnergy);
// hide assignment operator
G4ICRU73QOModel & operator=(const G4ICRU73QOModel &right);
G4ICRU73QOModel(const G4ICRU73QOModel&);
const G4ParticleDefinition* particle;
G4ParticleDefinition* theElectron;
G4ParticleChangeForLoss* fParticleChange;
G4DensityEffectData* denEffData;
G4double mass;
G4double q;
G4double chargeSquare;
G4double massRate;
G4double ratio;
G4double lowestKinEnergy;
G4bool isInitialised;
// get number of shell, energy and oscillator strenghts for material
G4int GetNumberOfShells(G4int Z) const;
G4double GetShellEnergy(G4int Z, G4int nbOfTheShell) const;
G4double GetOscillatorEnergy(G4int Z, G4int nbOfTheShell) const;
G4double GetShellStrength(G4int Z, G4int nbOfTheShell) const;
// calculate stopping number for L's term
G4double GetL0(G4double normEnergy) const;
// terms in Z^2
G4double GetL1(G4double normEnergy) const;
// terms in Z^3
G4double GetL2(G4double normEnergy) const;
// terms in Z^4
// Z of element at now avaliable for the model
static const G4int NQOELEM = 26;
static const G4int NQODATA = 130;
static const G4int ZElementAvailable[NQOELEM];
// number, energy and oscillator strenghts
// for an harmonic oscillator model of material
static const G4int startElemIndex[NQOELEM];
static const G4int nbofShellsForElement[NQOELEM];
static const G4double ShellEnergy[NQODATA];
static const G4double SubShellOccupation[NQODATA]; // Z * ShellStrength
G4int indexZ[100];
// variable for calculation of stopping number of L's term
static const G4double L0[67][2];
static const G4double L1[22][2];
static const G4double L2[14][2];
G4int sizeL0;
G4int sizeL1;
G4int sizeL2;
static const G4double factorBethe[99];
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline void G4ICRU73QOModel::SetParticle(const G4ParticleDefinition* p)
{
particle = p;
mass = particle->GetPDGMass();
q = particle->GetPDGCharge()/eplus;
chargeSquare = q*q;
massRate = mass/proton_mass_c2;
ratio = electron_mass_c2/mass;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4int G4ICRU73QOModel::GetNumberOfShells(G4int Z) const
{
G4int nShell = 0;
if(indexZ[Z] >= 0) { nShell = nbofShellsForElement[indexZ[Z]];
} else { nShell = G4AtomicShells::GetNumberOfShells(Z); }
return nShell;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double G4ICRU73QOModel::GetShellEnergy(G4int Z,
G4int nbOfTheShell) const
{
G4double shellEnergy = 0.;
G4int idx = indexZ[Z];
if(indexZ[Z] >= 0) { shellEnergy = ShellEnergy[startElemIndex[idx] + nbOfTheShell]*eV;
} else { shellEnergy = GetOscillatorEnergy(Z, nbOfTheShell); }
return shellEnergy;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double G4ICRU73QOModel::GetShellStrength(G4int Z,
G4int nbOfTheShell) const
{
G4double shellStrength = 0.;
G4int idx = indexZ[Z];
if(indexZ[Z] >= 0) { shellStrength = SubShellOccupation[startElemIndex[idx] + nbOfTheShell] / Z;
} else { shellStrength = 1.0 / Z * G4AtomicShells::GetNumberOfElectrons(Z,nbOfTheShell); }
return shellStrength;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline void G4ICRU73QOModel::SetLowestKinEnergy(const G4double val)
{
lowestKinEnergy = val;
}
#endif
@@ -0,0 +1,182 @@
//
// ********************************************************************
// * 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. *
// ********************************************************************
//
// G4IonCoulombCrossSection.hh
//-------------------------------------------------------------------
//
// GEANT4 Class header file
//
// File name: G4IonCoulombCrossSection
//
// Author: Cristina Consolandi
//
// Creation date: 05.10.2010 from G4eCoulombScatteringModel
//
// Class Description:
// Computation of Screen-Coulomb Cross Section
// for protons, alpha and heavy Ions
//
//
// Reference:
// M.J. Boschini et al. "Nuclear and Non-Ionizing Energy-Loss
// for Coulomb Scattered Particles from Low Energy up to Relativistic
// Regime in Space Radiation Environment"
// Accepted for publication in the Proceedings of the ICATPP Conference
// on Cosmic Rays for Particle and Astroparticle Physics, Villa Olmo, 7-8
// October, 2010, to be published by World Scientific (Singapore).
//
// Available for downloading at:
// http://arxiv.org/abs/1011.4822
//
// -------------------------------------------------------------------
//
#ifndef G4IonCoulombCrossSection_h
#define G4IonCoulombCrossSection_h 1
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "globals.hh"
#include "G4Material.hh"
#include "G4Element.hh"
#include "G4ElementVector.hh"
#include "G4NistManager.hh"
#include "G4ThreeVector.hh"
#include "G4Pow.hh"
#include "G4LossTableManager.hh"
class G4ParticleDefinition;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4IonCoulombCrossSection
{
public:
G4IonCoulombCrossSection();
virtual ~G4IonCoulombCrossSection();
void Initialise(const G4ParticleDefinition*, G4double cosThetaLim);
G4double NuclearCrossSection();
G4double SampleCosineTheta();
inline void SetupParticle(const G4ParticleDefinition*);
void SetupKinematic(G4double kinEnergy, G4double cut,G4int iz);
void SetupTarget(G4double Z, G4double kinEnergy,G4int heavycorr);
inline G4double GetMomentum2();
private:
void SetScreenRSquare(G4int iz);
G4IonCoulombCrossSection & operator=(const G4IonCoulombCrossSection &right);
G4IonCoulombCrossSection(const G4IonCoulombCrossSection&);
const G4ParticleDefinition* theProton;
G4NistManager* fNistManager;
protected:
G4double coeff;
//cost - min - max
G4double cosThetaMin;// def 1.0
G4double cosThetaMax;// def -1.0
//SetupTarget
G4double cosTetMinNuc;// -->cosThetaMin
G4double cosTetMaxNuc;// -->cosThetaMax
//cross section
G4double nucXSection;
//energy cut
G4double ecut;
G4double etag;
// projectile........................
const G4ParticleDefinition* particle;
G4double chargeSquare;
G4double spin;
G4double mass;
//lab of incedent particle
G4double tkinLab;
G4double momLab2;
G4double invbetaLab2;
//relative system with nucleus
G4double tkin;
G4double mom2;
G4double invbeta2;
// target nucleus
G4double targetZ;
G4double targetMass;
G4double screenZ;
private:
G4double alpha2;
G4double ScreenRSquare;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4IonCoulombCrossSection::SetupParticle(const G4ParticleDefinition* p)
{
particle = p;
mass = particle->GetPDGMass();
spin = particle->GetPDGSpin();
if(0.0 != spin) { spin = 0.5; }
G4double q = std::fabs(particle->GetPDGCharge()/eplus);
chargeSquare = q*q;
tkin = 0.0;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4IonCoulombCrossSection::GetMomentum2(){
return mom2;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif
@@ -0,0 +1,187 @@
//
// ********************************************************************
// * 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. *
// ********************************************************************
//
// G4IonCoulombScatteringModel.hh
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
// File name: G4IonCoulombScatteringModel
//
// Author: Cristina Consolandi
//
// Creation date: 05.10.2010 from G4eCoulombScatteringModel
// & G4CoulombScatteringModel
//
//
// Class Description:
// Single Scattering Model for
// for protons, alpha and heavy Ions
//
// Reference:
// M.J. Boschini et al. "Nuclear and Non-Ionizing Energy-Loss
// for Coulomb ScatteredParticles from Low Energy up to Relativistic
// Regime in Space Radiation Environment"
// Accepted for publication in the Proceedings of the ICATPP Conference
// on Cosmic Rays for Particle and Astroparticle Physics, Villa Olmo, 7-8
// October, 2010, to be published by World Scientific (Singapore).
//
// Available for downloading at:
// http://arxiv.org/abs/1011.4822
//
// -------------------------------------------------------------------
//
#ifndef G4IonCoulombScatteringModel_h
#define G4IonCoulombScatteringModel_h 1
#include "G4VEmModel.hh"
#include "globals.hh"
#include "G4NistManager.hh"
#include "G4IonCoulombCrossSection.hh"
#include <vector>
using namespace std;
class G4ParticleChangeForGamma;
class G4ParticleDefinition;
class G4IonCoulombScatteringModel : public G4VEmModel
{
public:
G4IonCoulombScatteringModel(const G4String& nam = "IonCoulombScattering");
virtual ~G4IonCoulombScatteringModel();
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);
inline void SetRecoilThreshold(G4double eth);
void SetHeavyIonCorr(G4int b) {heavycorr=b; };
G4int GetHeavyIonCorr() {return heavycorr; };
protected:
inline void DefineMaterial(const G4MaterialCutsCouple*);
inline void SetupParticle(const G4ParticleDefinition*);
private:
// hide assignment operator
G4IonCoulombScatteringModel & operator=(const G4IonCoulombScatteringModel &right);
G4IonCoulombScatteringModel(const G4IonCoulombScatteringModel&);
protected:
G4ParticleTable* theParticleTable;
G4ParticleChangeForGamma* fParticleChange;
G4NistManager* fNistManager;
G4IonCoulombCrossSection* ioncross;
const std::vector<G4double>* pCuts;
const G4MaterialCutsCouple* currentCouple;
const G4Material* currentMaterial;
const G4Element* currentElement;
G4int currentMaterialIndex;
G4int heavycorr;
G4double cosThetaMin;
G4double recoilThreshold;
// projectile
const G4ParticleDefinition* particle;
const G4ParticleDefinition* theProton;
G4double mass;
G4double lowEnergyLimit;
private:
G4bool isInitialised;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void G4IonCoulombScatteringModel::DefineMaterial(const G4MaterialCutsCouple* cup)
{
if(cup != currentCouple) {
currentCouple = cup;
currentMaterial = cup->GetMaterial();
currentMaterialIndex = currentCouple->GetIndex();
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline
void G4IonCoulombScatteringModel::SetupParticle(const G4ParticleDefinition* p)
{
if(p != particle) {
particle = p;
mass = particle->GetPDGMass();
ioncross->SetupParticle(p);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4IonCoulombScatteringModel::SetRecoilThreshold(G4double eth)
{
recoilThreshold = eth;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif
@@ -0,0 +1,104 @@
//
// ********************************************************************
// * 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: G4KleinNishinaModel.hh,v 1.1 2010/09/03 14:11:58 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
//
// File name: G4KleinNishinaModel
//
// Author: Vladimir Ivanchenko on base of G4KleinNishinaCompton
//
// Creation date: 13.06.2010
//
// Modifications:
//
// Class Description:
//
// Implementation of gamma Compton scattering with atomic effects
//
// -------------------------------------------------------------------
//
#ifndef G4KleinNishinaModel_h
#define G4KleinNishinaModel_h 1
#include "G4VEmModel.hh"
#include <vector>
class G4ParticleChangeForGamma;
class G4VAtomDeexcitation;
class G4KleinNishinaModel : public G4VEmModel
{
public:
G4KleinNishinaModel(const G4String& nam = "KleinNishina");
virtual ~G4KleinNishinaModel();
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);
protected:
G4ParticleDefinition* theGamma;
G4ParticleDefinition* theElectron;
G4ParticleChangeForGamma* fParticleChange;
G4double lowestGammaEnergy;
private:
// hide assignment operator
G4KleinNishinaModel & operator=(const G4KleinNishinaModel &right);
G4KleinNishinaModel(const G4KleinNishinaModel&);
G4VAtomDeexcitation* fAtomDeexcitation;
G4bool isInitialized;
std::vector<G4double> fProbabilities;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif
@@ -0,0 +1,90 @@
//
// ********************************************************************
// * 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: G4ModifiedTsai.hh,v 1.1 2010/10/14 15:17:48 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
//
// File name: G4ModifiedTsai
//
// Author: Andreia Trindade (andreia@lip.pt)
// Pedro Rodrigues (psilva@lip.pt)
// Luis Peralta (luis@lip.pt)
//
// Creation date: 21 March 2003
//
// Modifications:
// 21 Mar 2003 A.Trindade First implementation acording with new design
// 24 Mar 2003 A.Trindade Fix in Tsai generator in order to prevent theta
// generation above pi
// 13 Oct 2010 V.Ivanchenko Moved to standard and improved comment
//
// Class Description:
//
// Bremsstrahlung Angular Distribution Generation
// suggested by L.Urban (Geant3 manual (1993) Phys211)
// Derived from Tsai distribution (Rev Mod Phys 49,421(1977))
//
// -------------------------------------------------------------------
//
#ifndef G4ModifiedTsai_h
#define G4ModifiedTsai_h 1
#include "G4ios.hh"
#include "globals.hh"
#include "G4VBremAngularDistribution.hh"
class G4ModifiedTsai : public G4VBremAngularDistribution
{
public:
G4ModifiedTsai(const G4String& name = "");
virtual ~G4ModifiedTsai();
G4double PolarAngle(const G4double initial_energy,
const G4double final_energy,
const G4int Z);
void PrintGeneratorInformation() const;
protected:
private:
// hide assignment operator
G4ModifiedTsai & operator=(const G4ModifiedTsai &right);
G4ModifiedTsai(const G4ModifiedTsai&);
};
#endif
@@ -1,171 +0,0 @@
//
// ********************************************************************
// * 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: G4MscModel71.hh,v 1.6 2009/11/01 13:04:12 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
//
// GEANT4 Class header file
//
//
// File name: G4MscMOdel71
//
// Author: Laszlo Urban
//
// Creation date: 01.03.2001
//
// 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)
// 03-10-05 Model is freezed with the name McsModel71 (V.Ivanchenko)
// 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)
//
//
// Class Description:
//
// Implementation of the model of multiple scattering based on
// H.W.Lewis Phys Rev 78 (1950) 526 and L.Urban model
// -------------------------------------------------------------------
//
#ifndef G4MscModel71_h
#define G4MscModel71_h 1
#include "G4VEmModel.hh"
class G4ParticleChangeForMSC;
class G4Navigator;
class G4MscModel71 : public G4VEmModel
{
public:
G4MscModel71(G4double&, G4double&, G4double&, G4double&, G4bool&,
const G4String& nam = "UrbanMsc71");
virtual ~G4MscModel71();
virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
virtual G4double ComputeCrossSectionPerAtom(
const G4ParticleDefinition* particle,
G4double KineticEnergy,
G4double AtomicNumber,
G4double AtomicWeight=0.,
G4double cut =0.,
G4double emax=DBL_MAX);
virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double length,
G4double safety);
G4double GeomPathLength(G4PhysicsTable* theLambdaTable,
const G4MaterialCutsCouple* couple,
const G4ParticleDefinition* particle,
G4double& kineticEnergy,
G4double lambda,
G4double range,
G4double truePathLength);
G4double TrueStepLength(G4double geomStepLength);
G4double SampleCosineTheta(G4double trueStepLength,G4double KineticEnergy);
G4double SampleDisplacement();
void SetLateralDisplasmentFlag(G4bool val);
private:
// hide assignment operator
G4MscModel71 & operator=(const G4MscModel71 &right);
G4MscModel71(const G4MscModel71&);
const G4ParticleDefinition* particle;
G4ParticleChangeForMSC* fParticleChange;
G4Navigator* navigator;
G4double mass;
G4double charge;
G4double massRate;
G4double taubig;
G4double tausmall;
G4double taulim;
G4double currentTau;
G4double dtrl;
G4double NuclCorrPar;
G4double FactPar;
G4double factail ;
G4double sigmafactor;
G4double b;
G4double xsi;
G4double lambda0;
G4double tPathLength;
G4double par1,par2,par3 ;
G4double stepmin ;
G4double currentKinEnergy;
G4double currentRange ;
G4double currentRadLength;
G4bool samplez;
G4bool latDisplasment;
G4bool isInitialized;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4MscModel71::SetLateralDisplasmentFlag(G4bool val)
{
latDisplasment = val;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif
@@ -1,147 +0,0 @@
//
// ********************************************************************
// * 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: G4MultipleScattering.hh,v 1.36 2008/03/10 10:39:21 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
//
// -----------------------------------------------------------------------------
//
// GEANT4 Class header file
//
// File name: G4MultipleScattering
//
// Author: Laszlo Urban
//
// Creation date: March 2001
//
// Modifications:
//
// 07-08-01 new methods Store/Retrieve PhysicsTable
// 23-08-01 new angle and z distribution,energy dependence reduced,
// Store,Retrieve methods commented out temporarily, L.Urban
// 11-09-01 G4MultipleScatteringx put as default: G4MultipleScattering
// Store,Retrieve methods reactived (mma)
// 13-09-01 Unused TrueToGeomTransformation method deleted,
// class description (L.Urban)
// 19-09-01 come back to previous process name msc
// 17-04-02 NEW angle distribution + boundary algorithm modified, L.Urban
// 22-04-02 boundary algorithm modified -> important improvement in timing !!!!
// (L.Urban)
// 24-05-02 changes in data members, L.Urban
// 30-10-02 changes in data members, L.Urban
// 20-01-03 Migrade to cut per region (V.Ivanchenko)
// 05-02-03 changes in data members, L.Urban
// 28-03-03 Move to model design (V.Ivanchenko)
// 18-04-03 Change name (V.Ivanchenko)
// 16-06-03: ShortLived are not applicable any more (V.Ivanchenko)
// 17-08-04 name of data member facxsi changed to factail together
// with the corresponding set function (L.Urban)
// 08-11-04 Migration to new interface of Store/Retrieve tables (V.Ivantchenko)
// 15-04-05 optimize internal interfaces (V.Ivanchenko)
// 02-10-05 new algorithm for step limitation, new data members (L.Urban)
// 05-10-05 value of data member tlimitmin has been changed (L.Urban)
// 23-10-05 new Boolean data member prec (false ~ 7.1 like, true new step
// limit in TruePathLengthLimit, L.Urban)
// 25-10-05 prec renamed to steppingAlgorithm, set function triggers
// 'default' facrange too, true - 0.02, false - 0.2 (L.Urban)
// 26-10-05 the above is put in the function MscStepLimitation() (mma)
// 05-11-05 new data member rangecut (L.Urban)
// 13-11-05 some code cleaning (L.Urban)
// 07-12-05 GeomLimit is protected instead of public
// 11-12-05 data menber rangecut removed (L.Urban)
// 19-01-07 tlimitmin = facrange*50*micrometer, i.e. it depends on the
// value of facrange (L.Urban)
// 16-02-06 set function for data member factail (L.Urban)
// 13-10-06 data member factail removed, new data member skin
// together with set function, data member tkinlimit
// changed to lambdalimit (L.Urban)
// 07-03-07 remove method SetSkin, because it is now in the base class (VI)
//
//------------------------------------------------------------------------------
//
// class description
//
// The class simulates the multiple scattering for any kind
// of charged particle.
//
// class description - end
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#ifndef G4MultipleScattering_h
#define G4MultipleScattering_h 1
#include "G4VMultipleScattering.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4VMscModel;
class G4MultipleScattering : public G4VMultipleScattering
{
public: // with description
G4MultipleScattering(const G4String& processName="msc");
virtual ~G4MultipleScattering();
// returns true for charged particles, false otherwise
G4bool IsApplicable (const G4ParticleDefinition& p);
// 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;};
protected:
// This function initialise models
void InitialiseProcess(const G4ParticleDefinition*);
private: // data members
G4VMscModel* mscUrban;
G4double lambdalimit;
G4double dtrl;
G4bool samplez;
G4bool isInitialized;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -1,252 +0,0 @@
//
// ********************************************************************
// * 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: G4MultipleScattering71.hh,v 1.6 2008/07/16 11:27:41 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
//
//
//------------- G4MultipleScattering71 physics process --------------------------
// by Laszlo Urban, March 2001
//
// 07-08-01 new methods Store/Retrieve PhysicsTable
// 23-08-01 new angle and z distribution,energy dependence reduced,
// Store,Retrieve methods commented out temporarily, L.Urban
// 11-09-01 G4MultipleScatteringx put as default: G4MultipleScattering
// Store,Retrieve methods reactived (mma)
// 13-09-01 Unused TrueToGeomTransformation method deleted,
// class description (L.Urban)
// 19-09-01 come back to previous process name msc
// 17-04-02 NEW angle distribution + boundary algorithm modified, L.Urban
// 22-04-02 boundary algorithm modified -> important improvement in timing !!!!
// (L.Urban)
// 24-05-02 changes in data members, L.Urban
// 30-10-02 changes in data members, L.Urban
// 20-01-03 Migrade to cut per region (V.Ivanchenko)
// 05-02-03 changes in data members, L.Urban
// 28-03-03 Move to model design (V.Ivanchenko)
// 18-04-03 Change name (V.Ivanchenko)
// 16-06-03: ShortLived are not applicable any more (V.Ivanchenko)
// 17-08-04 name of data member facxsi changed to factail together
// with the corresponding set function (L.Urban)
// 08-11-04 Migration to new interface of Store/Retrieve tables (V.Ivantchenko)
// 15-04-05 optimize internal interfaces (V.Ivanchenko)
// 03-10-05 Process is freezed with the name 71 (V.Ivanchenko)
// 07-03-06 Create G4UrbanMscModel and move there step limit calculation (V.Ivanchenko)
//
//------------------------------------------------------------------------------
//
// $Id: G4MultipleScattering71.hh,v 1.6 2008/07/16 11:27:41 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// class description
//
// The class simulates the multiple scattering for any kind
// of charged particle.
//
// class description - end
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#ifndef G4MultipleScattering71_h
#define G4MultipleScattering71_h 1
#include "G4VMultipleScattering.hh"
#include "G4MscModel71.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4MultipleScattering71 : public G4VMultipleScattering
{
public: // with description
G4MultipleScattering71(const G4String& processName="msc");
virtual ~G4MultipleScattering71();
// returns true for charged particles, false otherwise
G4bool IsApplicable (const G4ParticleDefinition& p);
virtual G4VParticleChange* AlongStepDoIt(const G4Track&, const G4Step&);
virtual G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&);
G4double TruePathLengthLimit(const G4Track& track,
G4double& lambda,
G4double currentMinimalStep);
// 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);
// activate boundary algorithm
void SetBoundary(G4bool value);
// to reduce the energy/step dependence
void Setdtrl(G4double value);
void Setfactail(G4double value);
// Steplimit after boundary crossing = facrange*range
// estimated nb of steps at boundary nsmallstep = 1/facrange
void SetFacrange(G4double val);
// corrs to transport cross section for high energy
void SetNuclCorrPar(G4double val);
void SetFactPar(G4double val);
protected:
// This function initialise models
void InitialiseProcess(const G4ParticleDefinition*);
// This method is used for tracking, it returns step limit
virtual G4double GetContinuousStepLimit(const G4Track& track,
G4double previousStepSize,
G4double currentMinimalStep,
G4double& currentSafety);
private:
// hide assignment operator as private
G4MultipleScattering71 & operator = (const G4MultipleScattering71 &right);
G4MultipleScattering71 ( const G4MultipleScattering71 &);
private: // data members
G4MscModel71* model;
G4double lowKineticEnergy;
G4double highKineticEnergy;
G4int totBins;
G4double truePathLength;
G4double geomPathLength;
G4double trueStepLength;
G4double range;
G4double facrange;
G4double tlimit;
G4double tlimitmin;
G4double dtrl;
G4double NuclCorrPar;
G4double FactPar;
G4double factail;
G4double cf;
G4int stepnolastmsc;
G4int nsmallstep;
G4bool samplez;
G4bool boundary;
G4bool isInitialized;
};
//--------------------------------------------------------------------
// inline methods
//--------------------------------------------------------------------
inline G4bool G4MultipleScattering71::IsApplicable (const G4ParticleDefinition& p)
{
return (p.GetPDGCharge() != 0.0 && !p.IsShortLived());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4VParticleChange* G4MultipleScattering71::AlongStepDoIt(
const G4Track&,
const G4Step& step)
{
G4double geomStepLength = step.GetStepLength();
if((geomStepLength == geomPathLength) && (truePathLength <= range))
trueStepLength = truePathLength;
else
trueStepLength = model->TrueStepLength(geomStepLength);
fParticleChange.ProposeTrueStepLength(trueStepLength);
return &fParticleChange;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4VParticleChange* G4MultipleScattering71::PostStepDoIt(const G4Track& track,
const G4Step& step)
{
fParticleChange.Initialize(track);
std::vector<G4DynamicParticle*>* p = 0;
model->SampleSecondaries(p, CurrentMaterialCutsCouple(),track.GetDynamicParticle(),
step.GetStepLength(),step.GetPostStepPoint()->GetSafety());
return &fParticleChange;
}
// geom. step length distribution should be sampled or not
inline void G4MultipleScattering71::Setsamplez(G4bool value)
{
samplez = value;
}
// activate boundary algorithm
inline void G4MultipleScattering71::SetBoundary(G4bool value)
{
boundary = value;
}
// to reduce the energy/step dependence
inline void G4MultipleScattering71::Setdtrl(G4double value)
{
dtrl = value;
}
inline void G4MultipleScattering71::Setfactail(G4double value)
{
factail = value;
}
// Steplimit after boundary crossing = facrange*range
// estimated nb of steps at boundary nsmallstep = 1/facrange
inline void G4MultipleScattering71::SetFacrange(G4double val)
{
facrange = val;
nsmallstep = G4int(std::log((cf+facrange-1.)/facrange)/std::log(cf))+1;
}
// corrs to transport cross section for high energy
inline void G4MultipleScattering71::SetNuclCorrPar(G4double val)
{
NuclCorrPar = val;
}
inline void G4MultipleScattering71::SetFactPar(G4double val)
{
FactPar = val;
}
#endif
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4PAIySection.hh,v 1.1 2007/10/01 17:45:14 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4PAIySection.hh,v 1.3 2010/11/21 10:55:44 grichine Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
//
// G4PAIySection.hh -- header file
@@ -38,6 +38,7 @@
// History:
//
// 01.10.07, V.Ivanchenko create using V.Grichine G4PAIxSection class
// 21.11.10, V.Grichine, fVerbose and SetVerbose added
#ifndef G4PAIYSECTION_HH
#define G4PAIYSECTION_HH
@@ -60,131 +61,134 @@ public:
G4double maxEnergyTransfer,
G4double betaGammaSq);
void InitPAI() ;
void InitPAI();
void NormShift( G4double betaGammaSq ) ;
void NormShift( G4double betaGammaSq );
void SplainPAI( G4double betaGammaSq ) ;
void SplainPAI( G4double betaGammaSq );
// Physical methods
G4double RutherfordIntegral( G4int intervalNumber,
G4double limitLow,
G4double limitHigh ) ;
G4double limitHigh );
G4double ImPartDielectricConst( G4int intervalNumber,
G4double energy ) ;
G4double energy );
G4double RePartDielectricConst(G4double energy) ;
G4double RePartDielectricConst(G4double energy);
G4double DifPAIySection( G4int intervalNumber,
G4double betaGammaSq ) ;
G4double betaGammaSq );
G4double PAIdNdxCerenkov( G4int intervalNumber,
G4double betaGammaSq ) ;
G4double betaGammaSq );
G4double PAIdNdxPlasmon( G4int intervalNumber,
G4double betaGammaSq ) ;
G4double betaGammaSq );
void IntegralPAIySection() ;
void IntegralCerenkov() ;
void IntegralPlasmon() ;
void IntegralPAIySection();
void IntegralCerenkov();
void IntegralPlasmon();
G4double SumOverInterval(G4int intervalNumber) ;
G4double SumOverIntervaldEdx(G4int intervalNumber) ;
G4double SumOverInterCerenkov(G4int intervalNumber) ;
G4double SumOverInterPlasmon(G4int intervalNumber) ;
G4double SumOverInterval(G4int intervalNumber);
G4double SumOverIntervaldEdx(G4int intervalNumber);
G4double SumOverInterCerenkov(G4int intervalNumber);
G4double SumOverInterPlasmon(G4int intervalNumber);
G4double SumOverBorder( G4int intervalNumber,
G4double energy ) ;
G4double energy );
G4double SumOverBorderdEdx( G4int intervalNumber,
G4double energy ) ;
G4double energy );
G4double SumOverBordCerenkov( G4int intervalNumber,
G4double energy ) ;
G4double energy );
G4double SumOverBordPlasmon( G4int intervalNumber,
G4double energy ) ;
G4double energy );
G4double GetStepEnergyLoss( G4double step ) ;
G4double GetStepCerenkovLoss( G4double step ) ;
G4double GetStepPlasmonLoss( G4double step ) ;
G4double GetStepEnergyLoss( G4double step );
G4double GetStepCerenkovLoss( G4double step );
G4double GetStepPlasmonLoss( G4double step );
// Inline access functions
G4int GetNumberOfGammas() const { return fNumberOfGammas ; }
inline G4int GetNumberOfGammas() const { return fNumberOfGammas; }
G4int GetSplineSize() const { return fSplineNumber ; }
inline G4int GetSplineSize() const { return fSplineNumber; }
G4int GetIntervalNumber() const { return fIntervalNumber ; }
inline G4int GetIntervalNumber() const { return fIntervalNumber; }
G4double GetEnergyInterval(G4int i){ return fEnergyInterval[i] ; }
inline G4double GetEnergyInterval(G4int i){ return fEnergyInterval[i]; }
G4double GetDifPAIySection(G4int i){ return fDifPAIySection[i] ; }
G4double GetPAIdNdxCrenkov(G4int i){ return fdNdxCerenkov[i] ; }
G4double GetPAIdNdxPlasmon(G4int i){ return fdNdxPlasmon[i] ; }
inline G4double GetDifPAIySection(G4int i){ return fDifPAIySection[i]; }
inline G4double GetPAIdNdxCrenkov(G4int i){ return fdNdxCerenkov[i]; }
inline G4double GetPAIdNdxPlasmon(G4int i){ return fdNdxPlasmon[i]; }
G4double GetMeanEnergyLoss() const {return fIntegralPAIySection[0] ; }
G4double GetMeanCerenkovLoss() const {return fIntegralCerenkov[0] ; }
G4double GetMeanPlasmonLoss() const {return fIntegralPlasmon[0] ; }
inline G4double GetMeanEnergyLoss() const {return fIntegralPAIySection[0]; }
inline G4double GetMeanCerenkovLoss() const {return fIntegralCerenkov[0]; }
inline G4double GetMeanPlasmonLoss() const {return fIntegralPlasmon[0]; }
G4double GetNormalizationCof() const { return fNormalizationCof ; }
inline G4double GetNormalizationCof() const { return fNormalizationCof; }
inline G4double GetPAItable(G4int i,G4int j) const ;
inline G4double GetPAItable(G4int i,G4int j) const;
inline G4double GetLorentzFactor(G4int i) const ;
inline G4double GetLorentzFactor(G4int i) const;
inline G4double GetSplineEnergy(G4int i) const ;
inline G4double GetSplineEnergy(G4int i) const;
inline G4double GetIntegralPAIySection(G4int i) const ;
inline G4double GetIntegralPAIdEdx(G4int i) const ;
inline G4double GetIntegralCerenkov(G4int i) const ;
inline G4double GetIntegralPlasmon(G4int i) const ;
inline G4double GetIntegralPAIySection(G4int i) const;
inline G4double GetIntegralPAIdEdx(G4int i) const;
inline G4double GetIntegralCerenkov(G4int i) const;
inline G4double GetIntegralPlasmon(G4int i) const;
void SetVerbose(G4int v){fVerbose = v;};
private :
// Local class constants
static const G4double fDelta ; // energy shift from interval border = 0.001
static const G4double fError ; // error in lin-log approximation = 0.005
static const G4double fDelta; // energy shift from interval border = 0.001
static const G4double fError; // error in lin-log approximation = 0.005
static G4int fNumberOfGammas ; // = 111 ;
static const G4double fLorentzFactor[112] ; // static gamma array
static G4int fNumberOfGammas; // = 111;
static const G4double fLorentzFactor[112]; // static gamma array
static
const G4int fRefGammaNumber ; // The number of gamma for creation of spline (15)
const G4int fRefGammaNumber ; // The number of gamma for creation of spline (15)
G4int fIntervalNumber ; // The number of energy intervals
G4double fNormalizationCof ; // Normalization cof for PhotoAbsorptionXsection
G4int fIntervalNumber ; // The number of energy intervals
G4double fNormalizationCof; // Normalization cof for PhotoAbsorptionXsection
G4double fDensity ; // Current density
G4double fElectronDensity ; // Current electron (number) density
G4int fSplineNumber ; // Current size of spline
G4double fDensity; // Current density
G4double fElectronDensity; // Current electron (number) density
G4int fSplineNumber; // Current size of spline
G4int fVerbose; // verbose flag
G4SandiaTable* fSandia;
G4double fEnergyInterval[500] ;
G4double fA1[500] ;
G4double fA2[500] ;
G4double fA3[500] ;
G4double fA4[500] ;
G4double fEnergyInterval[500];
G4double fA1[500];
G4double fA2[500];
G4double fA3[500];
G4double fA4[500];
static
const G4int fMaxSplineSize ; // Max size of output splain arrays = 500
const G4int fMaxSplineSize ; // Max size of output splain arrays = 500
G4double fSplineEnergy[500] ; // energy points of splain
G4double fRePartDielectricConst[500] ; // Real part of dielectric const
G4double fImPartDielectricConst[500] ; // Imaginary part of dielectric const
G4double fIntegralTerm[500] ; // Integral term in PAI cross section
G4double fDifPAIySection[500] ; // Differential PAI cross section
G4double fdNdxCerenkov[500] ; // dNdx of Cerenkov collisions
G4double fdNdxPlasmon[500] ; // dNdx of Plasmon collisions
G4double fSplineEnergy[500]; // energy points of splain
G4double fRePartDielectricConst[500]; // Real part of dielectric const
G4double fImPartDielectricConst[500]; // Imaginary part of dielectric const
G4double fIntegralTerm[500]; // Integral term in PAI cross section
G4double fDifPAIySection[500]; // Differential PAI cross section
G4double fdNdxCerenkov[500]; // dNdx of Cerenkov collisions
G4double fdNdxPlasmon[500]; // dNdx of Plasmon collisions
G4double fIntegralPAIySection[500] ; // Integral PAI cross section ?
G4double fIntegralPAIdEdx[500] ; // Integral PAI dEdx ?
G4double fIntegralCerenkov[500] ; // Integral Cerenkov N>omega ?
G4double fIntegralPlasmon[500] ; // Integral Plasmon N>omega ?
G4double fIntegralPAIySection[500]; // Integral PAI cross section ?
G4double fIntegralPAIdEdx[500]; // Integral PAI dEdx ?
G4double fIntegralCerenkov[500]; // Integral Cerenkov N>omega ?
G4double fIntegralPlasmon[500]; // Integral Plasmon N>omega ?
G4double fPAItable[500][112] ; // Output array
G4double fPAItable[500][112]; // Output array
} ;
};
//////////////// Inline methods //////////////////////////////////
//
@@ -192,12 +196,12 @@ private :
inline G4double G4PAIySection::GetPAItable(G4int i, G4int j) const
{
return fPAItable[i][j] ;
return fPAItable[i][j];
}
inline G4double G4PAIySection::GetLorentzFactor(G4int j) const
{
return fLorentzFactor[j] ;
return fLorentzFactor[j];
}
inline G4double G4PAIySection::GetSplineEnergy(G4int i) const
@@ -206,7 +210,7 @@ inline G4double G4PAIySection::GetSplineEnergy(G4int i) const
{
G4Exception("Invalid argument in G4PAIySection::GetSplineEnergy");
}
return fSplineEnergy[i] ;
return fSplineEnergy[i];
}
inline G4double G4PAIySection::GetIntegralPAIySection(G4int i) const
@@ -215,7 +219,7 @@ inline G4double G4PAIySection::GetIntegralPAIySection(G4int i) const
{
G4Exception("Invalid argument in G4PAIySection::GetIntegralPAIySection");
}
return fIntegralPAIySection[i] ;
return fIntegralPAIySection[i];
}
inline G4double G4PAIySection::GetIntegralPAIdEdx(G4int i) const
@@ -224,7 +228,7 @@ inline G4double G4PAIySection::GetIntegralPAIdEdx(G4int i) const
{
G4Exception("Invalid argument in G4PAIySection::GetIntegralPAIySection");
}
return fIntegralPAIdEdx[i] ;
return fIntegralPAIdEdx[i];
}
inline G4double G4PAIySection::GetIntegralCerenkov(G4int i) const
@@ -233,7 +237,7 @@ inline G4double G4PAIySection::GetIntegralCerenkov(G4int i) const
{
G4Exception("Invalid argument in G4PAIySection::GetIntegralCerenkov");
}
return fIntegralCerenkov[i] ;
return fIntegralCerenkov[i];
}
inline G4double G4PAIySection::GetIntegralPlasmon(G4int i) const
@@ -242,7 +246,7 @@ inline G4double G4PAIySection::GetIntegralPlasmon(G4int i) const
{
G4Exception("Invalid argument in G4PAIySection::GetIntegralPlasmon");
}
return fIntegralPlasmon[i] ;
return fIntegralPlasmon[i];
}
#endif
@@ -0,0 +1,105 @@
//
// ********************************************************************
// * 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: G4PEEffectFluoModel.hh,v 1.1 2010/09/03 14:11:16 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
//
// File name: G4PEEffectFluoModel
//
// Author: Vladimir Ivanchenko on base of G4PEEffectModel
//
// Creation date: 13.06.2010
//
// Modifications:
//
// Class Description:
//
// Implementation of the photo-electric effect with deexcitation
//
// -------------------------------------------------------------------
//
#ifndef G4PEEffectFluoModel_h
#define G4PEEffectFluoModel_h 1
#include "G4VEmModel.hh"
class G4ParticleChangeForGamma;
class G4VAtomDeexcitation;
class G4PEEffectFluoModel : public G4VEmModel
{
public:
G4PEEffectFluoModel(const G4String& nam = "PhotoElectric");
virtual ~G4PEEffectFluoModel();
virtual
void Initialise(const G4ParticleDefinition*, const G4DataVector&);
virtual
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition*,
G4double kinEnergy,
G4double Z,
G4double A,
G4double, G4double);
virtual G4double CrossSectionPerVolume(const G4Material*,
const G4ParticleDefinition*,
G4double kineticEnergy,
G4double cutEnergy,
G4double maxEnergy);
virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double tmin,
G4double maxEnergy);
protected:
virtual G4double ElecCosThetaDistribution(G4double ElecKineEnergy);
private:
G4ParticleDefinition* theGamma;
G4ParticleDefinition* theElectron;
G4ParticleChangeForGamma* fParticleChange;
G4VAtomDeexcitation* fAtomDeexcitation;
G4double fminimalEnergy;
G4bool isInitialized;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4PSTARStopping.hh,v 1.5 2008/11/13 12:04:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4PSTARStopping.hh,v 1.7 2010/04/26 17:22:08 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
#ifndef G4PSTARStopping_h
#define G4PSTARStopping_h 1
@@ -55,6 +55,8 @@
#include "globals.hh"
#include "G4LPhysicsFreeVector.hh"
#include <vector>
class G4Material;
@@ -75,15 +77,17 @@ private:
void Initialise();
void AddData(G4double* e, G4double* s, G4int idx);
// hide assignment operator
G4PSTARStopping & operator=(const G4PSTARStopping &right);
G4PSTARStopping(const G4PSTARStopping&);
G4int matIndex;
const G4Material* currentMaterial;
G4int index, matIndex;
G4String name[74];
G4double currentE, res;
G4double e[74][60], kinE[60];
G4double emin;
std::vector<G4String> name;
std::vector<G4LPhysicsFreeVector*> sdata;
};
inline G4double G4PSTARStopping::GetElectronicDEDX(const G4Material* mat,
@@ -23,8 +23,8 @@
// * 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 $
// $Id: G4PairProductionRelModel.hh,v 1.9 2010/10/26 10:35:22 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -------------------------------------------------------------------
//
@@ -63,7 +63,7 @@ class G4PairProductionRelModel : public G4VEmModel
public:
G4PairProductionRelModel(const G4ParticleDefinition* p = 0,
const G4String& nam = "Bethe-Heitler");
const G4String& nam = "BetheHeitlerLPM");
virtual ~G4PairProductionRelModel();
@@ -87,7 +87,7 @@ public:
const G4Material*,G4double);
// * fast inline functions *
inline void SetCurrentElement(const G4double);
inline void SetCurrentElement(G4double /*Z*/);
// set / get methods
inline void SetLPMconstant(G4double val);
@@ -109,9 +109,6 @@ protected:
G4double ScreenFunction1(G4double ScreenVariable);
G4double ScreenFunction2(G4double ScreenVariable);
G4double ComputeXSectionPerAtom(G4double totalEnergy, G4double Z);
G4double ComputeDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double Z);
@@ -127,13 +124,6 @@ protected:
G4ParticleDefinition* theElectron;
G4ParticleDefinition* thePositron;
G4ParticleChangeForGamma* fParticleChange;
G4PhysicsTable* theCrossSectionTable;
G4double lowGammaEnergy;
G4double highGammaEnergy;
G4int nbins;
size_t indexZ[120];
G4double fLPMconstant;
G4bool fLPMflag;
@@ -195,7 +185,7 @@ G4bool G4PairProductionRelModel::LPMflag() const
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline void G4PairProductionRelModel::SetCurrentElement(const G4double Z)
inline void G4PairProductionRelModel::SetCurrentElement(G4double Z)
{
if(Z != currentZ) {
currentZ = Z;
@@ -213,10 +203,10 @@ inline void G4PairProductionRelModel::SetCurrentElement(const G4double Z)
Fel = facFel - lnZ/3. ;
Finel = facFinel - 2.*lnZ/3. ;
}
fCoulomb=GetCurrentElement()->GetfCoulomb();
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4PairProductionRelModel::Phi1(G4double delta) const
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4UniversalFluctuation.hh,v 1.10 2009/03/19 14:15:17 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4UniversalFluctuation.hh,v 1.12 2010/08/08 08:19:59 urban Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -------------------------------------------------------------------
//
@@ -33,7 +33,7 @@
//
// File name: G4UniversalFluctuation
//
// Author: Vladimir Ivanchenko
// Author: V.Ivanchenko make a class with the Laszlo Urban model
//
// Creation date: 03.01.2002
//
@@ -109,14 +109,16 @@ private:
G4double e2LogFluct;
G4double ipotLogFluct;
G4double e0;
G4double esmall;
G4double e1,e2;
G4double minNumberInteractionsBohr;
G4double theBohrBeta2;
G4double minLoss;
G4double nmaxCont1;
G4double nmaxCont2;
G4double nmaxCont;
G4double rate,fw;
};
@@ -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: G4UniversalFluctuation93.hh,v 1.2 2010/10/26 10:06:12 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -------------------------------------------------------------------
//
// GEANT4 Class header file
//
//
// File name: G4UniversalFluctuation93
//
// Author: V.Ivanchenko make a class with the Laszlo Urban model
//
// Creation date: 03.01.2002
//
// Modifications:
//
// 09-12-02 remove warnings (V.Ivanchenko)
// 28-12-02 add method Dispersion (V.Ivanchenko)
// 07-02-03 change signature (V.Ivanchenko)
// 13-02-03 Add name (V.Ivanchenko)
// 16-10-03 Changed interface to Initialisation (V.Ivanchenko)
// 07-02-05 define problim = 5.e-3 (mma)
// 14-06-10 saved version of 9.3 model with the name G4UniversalFluctuation93
//
// Class Description:
//
// Implementation of energy loss fluctuations
// -------------------------------------------------------------------
//
#ifndef G4UniversalFluctuation93_h
#define G4UniversalFluctuation93_h 1
#include "G4VEmFluctuationModel.hh"
#include "G4ParticleDefinition.hh"
class G4UniversalFluctuation93 : public G4VEmFluctuationModel
{
public:
G4UniversalFluctuation93(const G4String& nam = "UniFluc93");
virtual ~G4UniversalFluctuation93();
virtual G4double SampleFluctuations(const G4Material*,
const G4DynamicParticle*,
G4double&,
G4double&,
G4double&);
virtual G4double Dispersion( const G4Material*,
const G4DynamicParticle*,
G4double&,
G4double&);
virtual void InitialiseMe(const G4ParticleDefinition*);
// Initialisation prestep
virtual void SetParticleAndCharge(const G4ParticleDefinition*, G4double q2);
private:
// hide assignment operator
G4UniversalFluctuation93 & operator=(const G4UniversalFluctuation93 &right);
G4UniversalFluctuation93(const G4UniversalFluctuation93&);
const G4ParticleDefinition* particle;
const G4Material* lastMaterial;
G4double particleMass;
G4double chargeSquare;
// data members to speed up the fluctuation calculation
G4double ipotFluct;
G4double electronDensity;
G4double f1Fluct;
G4double f2Fluct;
G4double e1Fluct;
G4double e2Fluct;
G4double e1LogFluct;
G4double e2LogFluct;
G4double ipotLogFluct;
G4double e0;
G4double e1,e2;
G4double minNumberInteractionsBohr;
G4double theBohrBeta2;
G4double minLoss;
G4double nmaxCont1;
G4double nmaxCont2;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -1,229 +0,0 @@
//
// ********************************************************************
// * 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: G4UrbanMscModel.hh,v 1.35 2009/04/29 13:30:22 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
//
// GEANT4 Class header file
//
//
// File name: G4UrbanMscModel
//
// Author: Laszlo Urban
//
// Creation date: 06.03.2008
//
// Modifications:
//
// 28-04-09 move G4UrbanMscModel2 from the g49.2 to G4UrbanMscModel.
// now it is frozen (V.Ivanchenk0)
//
// Class Description:
//
// Implementation of the model of multiple scattering based on
// H.W.Lewis Phys Rev 78 (1950) 526 and L.Urban model
// -------------------------------------------------------------------
//
#ifndef G4UrbanMscModel_h
#define G4UrbanMscModel_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 G4UrbanMscModel : public G4VMscModel
{
public:
G4UrbanMscModel(const G4String& nam = "UrbanMscUni");
virtual ~G4UrbanMscModel();
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
G4UrbanMscModel & operator=(const G4UrbanMscModel &right);
G4UrbanMscModel(const G4UrbanMscModel&);
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 G4UrbanMscModel::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 G4UrbanMscModel::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 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
@@ -1,232 +0,0 @@
//
// ********************************************************************
// * 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: G4UrbanMscModel2.hh,v 1.17 2009/05/15 09:26:42 urban Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// -------------------------------------------------------------------
//
//
// GEANT4 Class header file
//
//
// File name: G4UrbanMscModel2
//
// Author: Laszlo Urban
//
// Creation date: 06.03.2008
//
// Modifications:
// 23.04.2009 L.Urban updated parameterization in UpdateCache method
//
//
// Class Description:
//
// Implementation of the model of multiple scattering based on
// H.W.Lewis Phys Rev 78 (1950) 526 and L.Urban model
// -------------------------------------------------------------------
//
#ifndef G4UrbanMscModel2_h
#define G4UrbanMscModel2_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 G4UrbanMscModel2 : public G4VMscModel
{
public:
G4UrbanMscModel2(const G4String& nam = "UrbanMscUni2");
virtual ~G4UrbanMscModel2();
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
G4UrbanMscModel2 & operator=(const G4UrbanMscModel2 &right);
G4UrbanMscModel2(const G4UrbanMscModel2&);
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 G4UrbanMscModel2::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 G4UrbanMscModel2::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 G4UrbanMscModel2::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: G4UrbanMscModel93.hh,v 1.1 2009/11/01 13:04:12 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4UrbanMscModel93.hh,v 1.4 2009/12/14 06:57:12 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
//
// -------------------------------------------------------------------
//
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4WaterStopping.hh,v 1.7 2009/06/19 10:39:48 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4WaterStopping.hh,v 1.8 2010/04/26 17:22:08 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
#ifndef G4WaterStopping_h
#define G4WaterStopping_h 1
@@ -78,6 +78,7 @@ private:
G4bool spline;
G4int Z[17];
G4double A[17];
G4double emin;
std::vector<G4LPhysicsFreeVector*> dedx;
};
@@ -0,0 +1,259 @@
//
// ********************************************************************
// * 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: G4WentzelOKandVIxSection.hh,v 1.6 2010/06/25 09:41:38 gunter Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
//
// -------------------------------------------------------------------
//
//
// GEANT4 Class header file
//
//
// File name: G4WentzelOKandVIxSection
//
// Authors: V.Ivanchenko and O.Kadri
//
// Creation date: 21.05.2010
//
// Modifications:
//
//
// Class Description:
//
// Implementation of the computation of total and transport cross sections,
// sample scattering angle for the single scattering case.
// to be used by single and multiple scattering models. References:
// 1) G.Wentzel, Z. Phys. 40 (1927) 590.
// 2) J.M. Fernandez-Varea et al., NIM B73 (1993) 447.
//
// -------------------------------------------------------------------
//
#ifndef G4WentzelOKandVIxSection_h
#define G4WentzelOKandVIxSection_h 1
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "globals.hh"
#include "G4Material.hh"
#include "G4Element.hh"
#include "G4ElementVector.hh"
#include "G4NistManager.hh"
#include "G4ThreeVector.hh"
#include "G4Pow.hh"
class G4ParticleDefinition;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4WentzelOKandVIxSection
{
public:
G4WentzelOKandVIxSection();
virtual ~G4WentzelOKandVIxSection();
void Initialise(const G4ParticleDefinition*, G4double CosThetaLim);
void SetupParticle(const G4ParticleDefinition*);
// return cos(ThetaMax) for msc and cos(thetaMin) for single scattering
// cut = DBL_MAX means no scattering off electrons
G4double SetupTarget(G4int Z, G4double cut = DBL_MAX);
G4double ComputeTransportCrossSectionPerAtom(G4double CosThetaMax);
G4ThreeVector SampleSingleScattering(G4double CosThetaMin,
G4double CosThetaMax,
G4double elecRatio = 0.0);
inline G4double ComputeNuclearCrossSection(G4double CosThetaMin,
G4double CosThetaMax);
inline G4double ComputeElectronCrossSection(G4double CosThetaMin,
G4double CosThetaMax);
inline G4double SetupKinematic(G4double kinEnergy, const G4Material* mat);
inline void SetTargetMass(G4double value);
inline void SetRelativisticMass(G4double value);
inline G4double GetMomentumSquare() const;
inline G4double GetCosThetaNuc() const;
inline G4double GetCosThetaElec() const;
private:
void ComputeMaxElectronScattering(G4double cut);
// hide assignment operator
G4WentzelOKandVIxSection & operator=(const G4WentzelOKandVIxSection &right);
G4WentzelOKandVIxSection(const G4WentzelOKandVIxSection&);
const G4ParticleDefinition* theProton;
const G4ParticleDefinition* theElectron;
const G4ParticleDefinition* thePositron;
const G4Material* currentMaterial;
G4NistManager* fNistManager;
G4Pow* fG4pow;
G4double numlimit;
G4double elecXSRatio;
// integer parameters
G4int nwarnings;
G4int nwarnlimit;
// single scattering parameters
G4double coeff;
G4double cosTetMaxElec;
G4double cosTetMaxNuc;
G4double cosThetaMax;
G4double alpha2;
// projectile
const G4ParticleDefinition* particle;
G4double chargeSquare;
G4double charge3;
G4double spin;
G4double mass;
G4double tkin;
G4double mom2;
G4double invbeta2;
G4double kinFactor;
G4double etag;
G4double ecut;
G4double lowEnergyLimit;
// target
G4int targetZ;
G4double targetMass;
G4double screenZ;
G4double formfactA;
G4double factorA2;
G4double factB;
G4double factD;
static G4double ScreenRSquare[100];
static G4double FormFactor[100];
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double
G4WentzelOKandVIxSection::SetupKinematic(G4double ekin, const G4Material* mat)
{
if(ekin != tkin || mat != currentMaterial) {
currentMaterial = mat;
tkin = ekin;
mom2 = tkin*(tkin + 2.0*mass);
invbeta2 = 1.0 + mass*mass/mom2;
factB = spin/invbeta2;
cosTetMaxNuc = cosThetaMax;
if(std::fabs(cosThetaMax) < 1.0) {
cosTetMaxNuc =
std::max(cosThetaMax,1.-factorA2*mat->GetIonisation()->GetInvA23()/mom2);
}
}
return cosTetMaxNuc;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline void G4WentzelOKandVIxSection::SetTargetMass(G4double value)
{
targetMass = value;
factD = std::sqrt(mom2)/value;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline void G4WentzelOKandVIxSection::SetRelativisticMass(G4double value)
{
mass = value;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double G4WentzelOKandVIxSection::GetMomentumSquare() const
{
return mom2;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double G4WentzelOKandVIxSection::GetCosThetaNuc() const
{
return cosTetMaxNuc;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double G4WentzelOKandVIxSection::GetCosThetaElec() const
{
return cosTetMaxElec;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double
G4WentzelOKandVIxSection::ComputeNuclearCrossSection(G4double cosTMin,
G4double cosTMax)
{
G4double xsec = 0.0;
if(cosTMax < cosTMin) {
xsec = targetZ*kinFactor*(cosTMin - cosTMax)/
((1.0 - cosTMin + screenZ)*(1.0 - cosTMax + screenZ));
}
return xsec;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double
G4WentzelOKandVIxSection::ComputeElectronCrossSection(G4double cosTMin,
G4double cosTMax)
{
G4double xsec = 0.0;
G4double cost1 = std::max(cosTMin,cosTetMaxElec);
G4double cost2 = std::max(cosTMax,cosTetMaxElec);
if(cost1 > cost2) {
xsec = kinFactor*(cost1 - cost2)/((1.0 - cost1 + screenZ)*(1.0 - cost2 + screenZ));
}
return xsec;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4WentzelVIModel.hh,v 1.21 2009/10/10 15:16:57 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4WentzelVIModel.hh,v 1.29 2010/05/27 14:22:05 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
//
// -------------------------------------------------------------------
//
@@ -39,7 +39,8 @@
// Creation date: 09.04.2008 from G4MuMscModel
//
// Modifications:
//
// 27-05-2010 V.Ivanchenko added G4WentzelOKandVIxSection class to
// compute cross sections and sample scattering angle
//
// Class Description:
//
@@ -59,13 +60,12 @@
#include "G4VMscModel.hh"
#include "G4PhysicsTable.hh"
#include "G4MscStepLimitType.hh"
#include "G4MaterialCutsCouple.hh"
#include "G4NistManager.hh"
#include "G4WentzelOKandVIxSection.hh"
class G4LossTableManager;
class G4ParticleChangeForMSC;
class G4ParticleDefinition;
class G4LossTableManager;
class G4Pow;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -99,103 +99,58 @@ public:
private:
G4double ComputeTransportXSectionPerAtom();
G4double ComputeXSectionPerVolume();
void ComputeMaxElectronScattering(G4double cut);
inline G4double GetLambda(G4double kinEnergy);
inline void SetupParticle(const G4ParticleDefinition*);
inline void SetupKinematic(G4double kinEnergy, G4double cut);
inline void SetupTarget(G4double Z, G4double kinEnergy);
inline void DefineMaterial(const G4MaterialCutsCouple*);
// hide assignment operator
G4WentzelVIModel & operator=(const G4WentzelVIModel &right);
G4WentzelVIModel(const G4WentzelVIModel&);
const G4ParticleDefinition* theProton;
const G4ParticleDefinition* theElectron;
const G4ParticleDefinition* thePositron;
G4LossTableManager* theManager;
G4ParticleChangeForMSC* fParticleChange;
G4WentzelOKandVIxSection* wokvi;
G4Pow* fG4pow;
G4PhysicsTable* theLambdaTable;
G4PhysicsTable* theLambda2Table;
G4LossTableManager* theManager;
const G4DataVector* currentCuts;
G4NistManager* fNistManager;
G4double numlimit;
G4double tlimitminfix;
G4double invsqrt12;
// cash
// cache kinematics
G4double preKinEnergy;
G4double ecut;
G4double lambda0;
G4double tPathLength;
G4double zPathLength;
G4double lambdaeff;
G4double currentRange;
G4double par1;
G4double par2;
G4double par3;
// data for single scattering mode
G4double xtsec;
std::vector<G4double> xsecn;
std::vector<G4double> prob;
G4int nelments;
G4int nbins;
G4int nwarnings;
G4int nwarnlimit;
G4double numlimit;
// cache material
G4int currentMaterialIndex;
const G4MaterialCutsCouple* currentCouple;
const G4Material* currentMaterial;
// single scattering parameters
G4double coeff;
G4double cosThetaMin;
G4double cosThetaMax;
G4double cosTetMaxNuc;
G4double cosTetMaxNuc2;
G4double cosTetMaxElec;
G4double cosTetMaxElec2;
G4double q2Limit;
G4double alpha2;
// projectile
const G4ParticleDefinition* particle;
G4double chargeSquare;
G4double spin;
G4double mass;
G4double tkin;
G4double mom2;
G4double invbeta2;
G4double kinFactor;
G4double etag;
G4double lowEnergyLimit;
// target
G4double targetZ;
G4double targetMass;
G4double screenZ;
G4double formfactA;
G4int iz;
static G4double ScreenRSquare[100];
static G4double FormFactor[100];
// flags
G4bool isInitialized;
G4bool inside;
@@ -221,14 +176,13 @@ G4double G4WentzelVIModel::GetLambda(G4double e)
{
G4double x;
if(theLambdaTable) {
G4bool b;
x = ((*theLambdaTable)[currentMaterialIndex])->GetValue(e, b);
x = ((*theLambdaTable)[currentMaterialIndex])->Value(e);
} else {
x = CrossSection(currentCouple,particle,e,
(*currentCuts)[currentMaterialIndex]);
}
if(x > DBL_MIN) x = 1./x;
else x = DBL_MAX;
if(x > DBL_MIN) { x = 1./x; }
else { x = DBL_MAX; }
return x;
}
@@ -239,51 +193,10 @@ inline void G4WentzelVIModel::SetupParticle(const G4ParticleDefinition* p)
// Initialise mass and charge
if(p != particle) {
particle = p;
mass = particle->GetPDGMass();
spin = particle->GetPDGSpin();
G4double q = particle->GetPDGCharge()/eplus;
chargeSquare = q*q;
tkin = 0.0;
wokvi->SetupParticle(p);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4WentzelVIModel::SetupKinematic(G4double ekin, G4double cut)
{
if(ekin != tkin || ecut != cut) {
tkin = ekin;
mom2 = tkin*(tkin + 2.0*mass);
invbeta2 = 1.0 + mass*mass/mom2;
cosTetMaxNuc = cosThetaMax;
if(mass < MeV && ekin <= 10.*cut) {
cosTetMaxNuc = ekin*(cosThetaMax + 1.0)/(10.*cut) - 1.0;
}
ComputeMaxElectronScattering(cut);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4WentzelVIModel::SetupTarget(G4double Z, G4double e)
{
if(Z != targetZ || e != etag) {
etag = e;
targetZ = Z;
iz = G4int(Z);
if(iz > 99) iz = 99;
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;
cosTetMaxElec2 = cosTetMaxElec;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -23,8 +23,8 @@
// * 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 $
// $Id: G4alphaIonisation.hh,v 1.3 2010/10/26 10:06:12 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -------------------------------------------------------------------
//
@@ -70,8 +70,6 @@ public:
// Print out of the class parameters
virtual void PrintInfo();
void ActivateNuclearStopping(G4bool);
protected:
virtual void InitialiseEnergyLossProcess(const G4ParticleDefinition*,
@@ -82,8 +80,6 @@ protected:
inline G4double BetheBlochEnergyThreshold();
inline G4bool NuclearStoppingFlag();
private:
// hide assignment operator
@@ -97,19 +93,11 @@ private:
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;
@@ -117,11 +105,4 @@ inline G4double G4alphaIonisation::BetheBlochEnergyThreshold()
//....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: G4eBremsstrahlungRelModel.hh,v 1.11 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4eBremsstrahlungRelModel.hh,v 1.14 2010/10/26 10:35:22 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -------------------------------------------------------------------
//
@@ -64,7 +64,7 @@ class G4eBremsstrahlungRelModel : public G4VEmModel
public:
G4eBremsstrahlungRelModel(const G4ParticleDefinition* p = 0,
const G4String& nam = "eBremRel");
const G4String& nam = "eBremLPM");
virtual ~G4eBremsstrahlungRelModel();
@@ -158,8 +158,8 @@ protected:
G4bool isElectron;
private:
// consts
G4double highKinEnergy;
G4double lowKinEnergy;
G4double fMigdalConstant;
G4double fLPMconstant;
@@ -194,8 +194,8 @@ inline void G4eBremsstrahlungRelModel::SetCurrentElement(const G4double Z)
Finel = facFinel - 2.*lnZ/3. ;
}
fCoulomb=GetCurrentElement()->GetfCoulomb();
fMax = Fel-fCoulomb + Finel/currentZ + (1.+1./currentZ)/12.;
fCoulomb = GetCurrentElement()->GetfCoulomb();
fMax = Fel-fCoulomb + Finel/currentZ + (1.+1./currentZ)/12.;
}
}
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4eCoulombScatteringModel.hh,v 1.49 2009/10/10 15:16:57 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4eCoulombScatteringModel.hh,v 1.56 2010/05/27 14:22:05 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
//
// -------------------------------------------------------------------
//
@@ -46,6 +46,8 @@
// 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
// 27.05.10 V.Ivanchenko added G4WentzelOKandVIxSection class to
// compute cross sections and sample scattering angle
//
//
// Class Description:
@@ -65,13 +67,14 @@
#define G4eCoulombScatteringModel_h 1
#include "G4VEmModel.hh"
#include "G4PhysicsTable.hh"
#include "globals.hh"
#include "G4NistManager.hh"
#include <vector>
#include "G4MaterialCutsCouple.hh"
#include "G4WentzelOKandVIxSection.hh"
class G4ParticleChangeForGamma;
class G4ParticleDefinition;
class G4ParticleTable;
class G4NistManager;
class G4eCoulombScatteringModel : public G4VEmModel
{
@@ -98,38 +101,29 @@ public:
G4double tmin,
G4double maxEnergy);
// defines low energy limit of the model
inline void SetLowEnergyLimit(G4double val);
// obsolete method
inline void SetRecoilThreshold(G4double eth);
protected:
G4double CrossSectionPerAtom();
G4double SampleCosineTheta();
inline void DefineMaterial(const G4MaterialCutsCouple*);
inline void SetupParticle(const G4ParticleDefinition*);
inline void SetupKinematic(G4double kinEnergy, G4double cut);
inline void SetupTarget(G4double Z, G4double kinEnergy);
private:
void ComputeMaxElectronScattering(G4double cut);
// hide assignment operator
G4eCoulombScatteringModel & operator=(const G4eCoulombScatteringModel &right);
G4eCoulombScatteringModel(const G4eCoulombScatteringModel&);
protected:
const G4ParticleDefinition* theProton;
const G4ParticleDefinition* theElectron;
const G4ParticleDefinition* thePositron;
G4ParticleTable* theParticleTable;
G4ParticleTable* theParticleTable;
G4ParticleChangeForGamma* fParticleChange;
G4WentzelOKandVIxSection* wokvi;
G4NistManager* fNistManager;
const std::vector<G4double>* pCuts;
@@ -139,48 +133,22 @@ protected:
const G4Element* currentElement;
G4int currentMaterialIndex;
G4double coeff;
G4double cosThetaMin;
G4double cosThetaMax;
G4double cosTetMinNuc;
G4double cosTetMaxNuc;
G4double cosTetMaxNuc2;
G4double cosTetMaxElec;
G4double cosTetMaxElec2;
G4double q2Limit;
G4double recoilThreshold;
G4double elecXSection;
G4double nucXSection;
G4double ecut;
G4double elecRatio;
G4double mass;
// projectile
const G4ParticleDefinition* particle;
const G4ParticleDefinition* theProton;
G4double chargeSquare;
G4double spin;
G4double mass;
G4double tkin;
G4double mom2;
G4double invbeta2;
G4double etag;
G4double lowEnergyLimit;
// target
G4double targetZ;
G4double targetMass;
G4double screenZ;
G4double formfactA;
G4int idxelm;
G4int iz;
private:
G4double alpha2;
G4double faclim;
static G4double ScreenRSquare[100];
static G4double FormFactor[100];
G4bool isInitialised;
};
@@ -205,53 +173,17 @@ void G4eCoulombScatteringModel::SetupParticle(const G4ParticleDefinition* p)
if(p != particle) {
particle = p;
mass = particle->GetPDGMass();
spin = particle->GetPDGSpin();
G4double q = particle->GetPDGCharge()/eplus;
chargeSquare = q*q;
tkin = 0.0;
wokvi->SetupParticle(p);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4eCoulombScatteringModel::SetupKinematic(G4double ekin,
G4double cut)
inline void G4eCoulombScatteringModel::SetLowEnergyLimit(G4double val)
{
if(ekin != tkin || ecut != cut) {
tkin = ekin;
mom2 = tkin*(tkin + 2.0*mass);
invbeta2 = 1.0 + mass*mass/mom2;
cosTetMinNuc = cosThetaMin;
cosTetMaxNuc = cosThetaMax;
if(mass < MeV && cosThetaMin < 1.0 && ekin <= 10.*cut) {
cosTetMinNuc = ekin*(cosThetaMin + 1.0)/(10.*cut) - 1.0;
}
ComputeMaxElectronScattering(cut);
}
lowEnergyLimit = val;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4eCoulombScatteringModel::SetupTarget(G4double Z, G4double e)
{
if(Z != targetZ || e != etag) {
etag = e;
targetZ = Z;
iz= G4int(Z);
if(iz > 99) iz = 99;
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(1 == iz && particle == theProton && cosTetMaxNuc2 < 0.0) {
cosTetMaxNuc2 = 0.0;
}
cosTetMaxElec2 = cosTetMaxElec;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4eCoulombScatteringModel::SetRecoilThreshold(G4double eth)
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4eMultipleScattering.hh,v 1.3 2009/11/01 13:04:12 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4eMultipleScattering.hh,v 1.4 2010/10/26 10:39:02 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -----------------------------------------------------------------------------
//
@@ -63,7 +63,7 @@ class G4eMultipleScattering : public G4VMultipleScattering
{
public: // with description
G4eMultipleScattering(const G4String& processName="msc");
G4eMultipleScattering(const G4String& processName = "msc");
virtual ~G4eMultipleScattering();
@@ -74,13 +74,13 @@ public: // with description
void PrintInfo();
// geom. step length distribution should be sampled or not
void Setsamplez(G4bool value) { samplez = value;};
//void Setsamplez(G4bool value) { samplez = value;};
// to reduce the energy/step dependence
void Setdtrl(G4double value) { dtrl = value;};
//void Setdtrl(G4double value) { dtrl = value;};
// 'soften' step limitation above lambdalimit
void SetLambdalimit(G4double value) { lambdalimit = value;};
//void SetLambdalimit(G4double value) { lambdalimit = value;};
protected:
@@ -89,10 +89,10 @@ protected:
private: // data members
G4double lambdalimit;
G4double dtrl;
// G4double lambdalimit;
//G4double dtrl;
G4bool samplez;
//G4bool samplez;
G4bool isInitialized;
};
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4hIonisation.hh,v 1.42 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4hIonisation.hh,v 1.44 2010/05/27 10:25:23 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04-beta-01 $
//
// -------------------------------------------------------------------
//
@@ -100,6 +100,7 @@ public:
// Print out of the class parameters
virtual void PrintInfo();
// obsolete method
void ActivateNuclearStopping(G4bool);
protected:
@@ -114,7 +115,6 @@ private:
G4hIonisation(const G4hIonisation&);
G4bool isInitialised;
G4bool nuclearStopping;
G4double mass;
G4double ratio;
@@ -123,11 +123,4 @@ private:
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4hIonisation::ActivateNuclearStopping(G4bool val)
{
nuclearStopping = val;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif
@@ -23,8 +23,8 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: G4ionIonisation.hh,v 1.57 2009/02/20 12:06:37 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4ionIonisation.hh,v 1.58 2010/09/28 15:50:00 vnivanch Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -------------------------------------------------------------------
//
@@ -94,8 +94,6 @@ public:
void ActivateStoppingData(G4bool);
void ActivateNuclearStopping(G4bool);
protected:
virtual void InitialiseEnergyLossProcess(const G4ParticleDefinition*,
@@ -106,8 +104,6 @@ protected:
inline G4double BetheBlochEnergyThreshold();
inline G4bool NuclearStoppingFlag();
private:
// hide assignment operator
@@ -122,7 +118,6 @@ private:
G4bool isInitialised;
G4bool stopDataActive;
G4bool nuclearStopping;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
@@ -135,13 +130,6 @@ inline void G4ionIonisation::ActivateStoppingData(G4bool val)
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4ionIonisation::ActivateNuclearStopping(G4bool val)
{
nuclearStopping = val;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4ionIonisation::BetheBlochEnergyThreshold()
{
return eth;
@@ -149,11 +137,4 @@ inline G4double G4ionIonisation::BetheBlochEnergyThreshold()
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4bool G4ionIonisation::NuclearStoppingFlag()
{
return nuclearStopping;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#endif