Import Geant4 5.2.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-09 10:28:22 +02:00
parent fbd4999cf7
commit 4aea781e80
5454 changed files with 223141 additions and 67347 deletions
@@ -93,22 +93,12 @@ public:
G4double tmin,
G4double maxEnergy);
G4std::vector<G4DynamicParticle*>* SampleSecondaries(
std::vector<G4DynamicParticle*>* SampleSecondaries(
const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double tmin,
G4double maxEnergy);
G4double SampleCosineTheta(G4double& kineticEnergy,
G4double& energyDeposition,
G4double& stepLength,
G4double& lambda) {return 1.0;};
G4double SampleDisplacement(G4double& kineticEnergy,
G4double& truePathLength,
G4double& stepLength,
G4double& lambda) {return 0.0;};
G4double MaxSecondaryEnergy(const G4DynamicParticle*);
protected:
@@ -140,7 +130,7 @@ private:
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4BetheBlochModel::MaxSecondaryEnergy(
const G4ParticleDefinition* p,
const G4ParticleDefinition*,
G4double kinEnergy)
{
@@ -87,6 +87,8 @@ private:
G4double minNumberInteractionsBohr;
G4double minFraction;
G4double xmin;
G4double minLoss;
// cash
G4double kineticEnergy;
G4double beta2;
@@ -92,22 +92,12 @@ public:
G4double tmin,
G4double maxEnergy);
G4std::vector<G4DynamicParticle*>* SampleSecondaries(
std::vector<G4DynamicParticle*>* SampleSecondaries(
const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double tmin,
G4double maxEnergy);
G4double SampleCosineTheta(G4double& kineticEnergy,
G4double& energyDeposition,
G4double& stepLength,
G4double& lambda) {return 1.0;};
G4double SampleDisplacement(G4double& kineticEnergy,
G4double& truePathLength,
G4double& stepLength,
G4double& lambda) {return 0.0;};
G4double MaxSecondaryEnergy(const G4DynamicParticle*);
protected:
@@ -159,7 +149,7 @@ private:
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4BraggModel::MaxSecondaryEnergy(
const G4ParticleDefinition* p,
const G4ParticleDefinition*,
G4double kinEnergy)
{
@@ -40,6 +40,7 @@
// 13-02-03 The set of models is defined for region (V.Ivanchenko)
// 26-03-03 Add GetDEDXDispersion (V.Ivanchenko)
// 13-04-03 Add startFromNull (V.Ivanchenko)
// 13-05-03 Add calculation of precise range (V.Ivanchenko)
//
// Class Description:
//
@@ -70,7 +71,7 @@ public:
private:
G4RegionModels(G4int nMod, G4std::vector<G4int>& list, G4DataVector& lowE);
G4RegionModels(G4int nMod, std::vector<G4int>& list, G4DataVector& lowE);
~G4RegionModels();
@@ -130,6 +131,8 @@ public:
void FillDEDXVector(G4PhysicsVector*, const G4MaterialCutsCouple*);
void FillDEDXVectorForPreciseRange(G4PhysicsVector*, const G4MaterialCutsCouple*);
void FillLambdaVector(G4PhysicsVector*, const G4MaterialCutsCouple*,
G4bool startFromNull = true);
@@ -168,18 +171,18 @@ private:
G4DataVector theCuts;
G4DataVector theSubCuts;
G4std::vector<G4VEmModel*> models;
G4std::vector<G4VEmFluctuationModel*> flucModels;
G4std::vector<const G4Region*> regions;
G4std::vector<G4int> orderOfModels;
std::vector<G4VEmModel*> models;
std::vector<G4VEmFluctuationModel*> flucModels;
std::vector<const G4Region*> regions;
std::vector<G4int> orderOfModels;
G4DataVector upperEkin;
G4int nEmModels;
G4int nRegions;
G4int nCouples;
G4std::vector<G4int> idxOfRegionModels;
G4std::vector<G4RegionModels*> setOfRegionModels;
std::vector<G4int> idxOfRegionModels;
std::vector<G4RegionModels*> setOfRegionModels;
G4double minSubRange;
@@ -21,8 +21,8 @@
// ********************************************************************
//
//
// $Id: G4EnergyLossMessenger.hh,v 1.5 2003/04/04 14:33:33 vnivanch Exp $
// GEANT4 tag $Name: geant4-05-01 $
// $Id: G4EnergyLossMessenger.hh,v 1.6 2003/05/13 14:16:27 vnivanch Exp $
// GEANT4 tag $Name: geant4-05-02 $
//
//
// Class Description:
@@ -76,6 +76,7 @@ class G4EnergyLossMessenger: public G4UImessenger
G4UIcmdWithADoubleAndUnit* MinEnCmd;
G4UIcmdWithADoubleAndUnit* MaxEnCmd;
G4UIcmdWithABool* IntegCmd;
G4UIcmdWithABool* rangeCmd;
};
#endif
@@ -21,8 +21,8 @@
// ********************************************************************
//
//
// $Id: G4EnergyLossTables.hh,v 1.16 2003/04/12 17:54:39 vnivanch Exp $
// GEANT4 tag $Name: geant4-05-01 $
// $Id: G4EnergyLossTables.hh,v 1.17 2003/06/16 17:02:34 gunter Exp $
// GEANT4 tag $Name: geant4-05-02 $
//
// $Id:
//
@@ -31,7 +31,7 @@
#ifndef included_G4EnergyLossTables
#define included_G4EnergyLossTables
#include "g4std/map"
#include <map>
#include "globals.hh"
#include "G4PhysicsTable.hh"
@@ -202,7 +202,7 @@ private:
static void CPRWarning();
static void ParticleHaveNoLoss(const G4ParticleDefinition* aParticle);
typedef G4std::map<K,G4EnergyLossTablesHelper,G4std::less<K> > helper_map;
typedef std::map<K,G4EnergyLossTablesHelper,std::less<K> > helper_map;
static helper_map dict;
static G4EnergyLossTablesHelper GetTables(const G4ParticleDefinition* p);
@@ -88,6 +88,8 @@ private:
G4double minNumberInteractionsBohr;
G4double theBohrBeta2;
G4double minFraction;
G4double xmin;
G4double minLoss;
// cash
G4double kineticEnergy;
G4double beta2;
@@ -46,7 +46,7 @@
#ifndef G4LossTableBuilder_h
#define G4LossTableBuilder_h 1
#include "g4std/vector"
#include <vector>
#include "globals.hh"
#include "G4PhysicsTable.hh"
@@ -60,7 +60,7 @@ public:
~G4LossTableBuilder() {};
G4PhysicsTable* BuildDEDXTable(const G4std::vector<G4PhysicsTable*>&);
G4PhysicsTable* BuildDEDXTable(const std::vector<G4PhysicsTable*>&);
G4PhysicsTable* BuildRangeTable(const G4PhysicsTable* dedxTable);
@@ -59,8 +59,8 @@
#define G4LossTableManager_h 1
#include "g4std/map"
#include "g4std/vector"
#include <map>
#include <vector>
#include "globals.hh"
#include "G4LossTableBuilder.hh"
#include "G4VEnergyLossSTD.hh"
@@ -134,6 +134,8 @@ public:
void SetStepLimits(G4double v1, G4double v2);
void SetBuildPreciseRange(G4bool val);
G4EnergyLossMessenger* GetMessenger();
private:
@@ -151,16 +153,16 @@ private:
static G4LossTableManager* theInstance;
typedef const G4ParticleDefinition* PD;
G4std::map<PD,G4VEnergyLossSTD*,G4std::less<PD> > loss_map;
std::map<PD,G4VEnergyLossSTD*,std::less<PD> > loss_map;
G4std::vector<G4VEnergyLossSTD*> loss_vector;
G4std::vector<PD> part_vector;
G4std::vector<PD> base_part_vector;
G4std::vector<G4bool> tables_are_built;
G4std::vector<G4PhysicsTable*> dedx_vector;
G4std::vector<G4PhysicsTable*> range_vector;
G4std::vector<G4PhysicsTable*> inv_range_vector;
G4std::vector<G4VMultipleScattering*> msc_vector;
std::vector<G4VEnergyLossSTD*> loss_vector;
std::vector<PD> part_vector;
std::vector<PD> base_part_vector;
std::vector<G4bool> tables_are_built;
std::vector<G4PhysicsTable*> dedx_vector;
std::vector<G4PhysicsTable*> range_vector;
std::vector<G4PhysicsTable*> inv_range_vector;
std::vector<G4VMultipleScattering*> msc_vector;
// cash
G4VEnergyLossSTD* currentLoss;
@@ -176,7 +178,11 @@ private:
G4bool subCutoffFlag;
G4bool rndmStepFlag;
G4bool integral;
G4bool integralActive;
G4bool all_tables_are_stored;
G4bool buildPreciseRange;
G4bool minEnergyActive;
G4bool maxEnergyActive;
G4double minSubRange;
G4double maxRangeVariation;
@@ -201,7 +207,7 @@ inline G4double G4LossTableManager::GetDEDX(
const G4MaterialCutsCouple *couple)
{
if(aParticle != currentParticle) {
G4std::map<PD, G4VEnergyLossSTD*,G4std::less<PD> >::const_iterator pos;
std::map<PD, G4VEnergyLossSTD*,std::less<PD> >::const_iterator pos;
if ((pos = loss_map.find(aParticle)) != loss_map.end()) {
currentParticle = aParticle;
currentLoss = (*pos).second;
@@ -220,7 +226,7 @@ inline G4double G4LossTableManager::GetRange(
const G4MaterialCutsCouple *couple)
{
if(aParticle != currentParticle) {
G4std::map<PD, G4VEnergyLossSTD*, G4std::less<PD> >::const_iterator pos;
std::map<PD, G4VEnergyLossSTD*, std::less<PD> >::const_iterator pos;
if ((pos = loss_map.find(aParticle)) != loss_map.end()) {
currentParticle = aParticle;
currentLoss = (*pos).second;
@@ -239,7 +245,7 @@ inline G4double G4LossTableManager::GetEnergy(
const G4MaterialCutsCouple *couple)
{
if(aParticle != currentParticle) {
G4std::map<PD,G4VEnergyLossSTD*,G4std::less<PD> >::const_iterator pos;
std::map<PD,G4VEnergyLossSTD*,std::less<PD> >::const_iterator pos;
if ((pos = loss_map.find(aParticle)) != loss_map.end()) {
currentParticle = aParticle;
currentLoss = (*pos).second;
@@ -259,7 +265,7 @@ inline G4double G4LossTableManager::GetDEDXDispersion(
{
const G4ParticleDefinition* aParticle = dp->GetDefinition();
if(aParticle != currentParticle) {
G4std::map<PD,G4VEnergyLossSTD*,G4std::less<PD> >::const_iterator pos;
std::map<PD,G4VEnergyLossSTD*,std::less<PD> >::const_iterator pos;
if ((pos = loss_map.find(aParticle)) != loss_map.end()) {
currentParticle = aParticle;
currentLoss = (*pos).second;
@@ -26,7 +26,7 @@
// GEANT4 Class header file
//
//
// File name: G4LewisModel
// File name: G4MscModel
//
// Author: Laszlo Urban
//
@@ -35,30 +35,31 @@
// Modifications:
//
// 27-03-03 Move model part from G4MultipleScattering (V.Ivanchenko)
// 27-03-03 Rename (V.Ivanchenko)
//
//
// Class Description:
//
// Implementation of Lewis model of multiple scattering
// H.W.Lewis Phys Rev 78 (1950) 526
// Implementation of the model of multiple scattering based on
// H.W.Lewis Phys Rev 78 (1950) 526 and others
// -------------------------------------------------------------------
//
#ifndef G4LewisModel_h
#define G4LewisModel_h 1
#ifndef G4MscModel_h
#define G4MscModel_h 1
#include "G4VEmModel.hh"
class G4LewisModel : public G4VEmModel
class G4MscModel : public G4VEmModel
{
public:
G4LewisModel(G4double&, G4double&, G4double&, G4double&, G4bool&,
const G4String& nam = "Lewis");
G4MscModel(G4double&, G4double&, G4double&, G4double&, G4bool&,
const G4String& nam = "MscUni");
~G4LewisModel();
~G4MscModel();
void Initialise(const G4ParticleDefinition*, const G4DataVector&);
@@ -77,8 +78,8 @@ public:
G4double ComputeDEDX(const G4Material*,
const G4ParticleDefinition*,
G4double kineticEnergy,
G4double cutEnergy) {return 0.0;};
G4double,
G4double) {return 0.0;};
G4double CrossSection(const G4Material*,
const G4ParticleDefinition*,
@@ -89,14 +90,14 @@ public:
G4DynamicParticle* SampleSecondary(
const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double tmin,
G4double maxEnergy) {return 0;};
G4double,
G4double) {return 0;};
G4std::vector<G4DynamicParticle*>* SampleSecondaries(
std::vector<G4DynamicParticle*>* SampleSecondaries(
const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double tmin,
G4double maxEnergy) {return 0;};
G4double,
G4double) {return 0;};
G4double GeomPathLength(G4PhysicsTable* theLambdaTable,
const G4MaterialCutsCouple* couple,
@@ -117,7 +118,7 @@ public:
protected:
G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
G4double kinEnergy) {return 0.0;};
G4double) {return 0.0;};
private:
@@ -128,12 +129,12 @@ private:
G4double AtomicWeight);
// hide assignment operator
G4LewisModel & operator=(const G4LewisModel &right);
G4LewisModel(const G4LewisModel&);
G4MscModel & operator=(const G4MscModel &right);
G4MscModel(const G4MscModel&);
const G4ParticleDefinition* particle;
G4double mass;
G4double chargeSquare;
G4double charge;
G4double massRate;
G4double highKinEnergy;
G4double lowKinEnergy;
@@ -167,6 +168,8 @@ private:
G4double stepmin ;
G4double currentRadLength;
G4double currentKinEnergy;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
@@ -21,7 +21,7 @@
// ********************************************************************
//
// $Id: G4MultipleScattering.hh,v 1.16 2003/04/18 12:44:04 vnivanch Exp $
// GEANT4 tag $Name: geant4-05-01 $
// GEANT4 tag $Name: geant4-05-02 $
//
//------------- G4MultipleScattering physics process --------------------------
// by Laszlo Urban, March 2001
@@ -20,8 +20,8 @@
// * statement, and all its terms. *
// ********************************************************************
//
// $Id: G4MultipleScattering.icc,v 1.9 2003/04/18 12:44:05 vnivanch Exp $
// GEANT4 tag $Name: geant4-05-01 $
// $Id: G4MultipleScattering.icc,v 1.11 2003/06/16 14:43:11 vnivanch Exp $
// GEANT4 tag $Name: geant4-05-02 $
//
//------------ G4MultipleScattering physics process ---------------------------
// by Laszlo Urban, March 2001
@@ -36,6 +36,7 @@
// 11-09-01 G4MultipleScatteringx put as default: G4MultipleScattering (mma)
// 15-01-03 Migrade to cut per region (V.Ivanchenko)
// 18-04-03 Change signature of GetTransportMeanFreePath (V.Ivanchenko)
// 16-06-03: ShortLived are not applicable any more (V.Ivanchenko)
//
//------------------------------------------------------------------------------
@@ -44,7 +45,7 @@
inline
G4bool G4MultipleScattering::IsApplicable(const G4ParticleDefinition& particle)
{
return(particle.GetPDGCharge() != 0.);
return(particle.GetPDGCharge() != 0. && !particle.IsShortLived());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -67,7 +68,7 @@ inline G4double G4MultipleScattering::AlongStepGetPhysicalInteractionLength(
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double G4MultipleScattering::GetMeanFreePath(
const G4Track& track,
const G4Track&,
G4double,
G4ForceCondition* condition)
@@ -40,8 +40,14 @@
// 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)
//
//------------------------------------------------------------------------------
//
// $Id: G4MultipleScatteringSTD.hh,v 1.13 2003/06/16 14:44:10 vnivanch Exp $
// GEANT4 tag $Name: geant4-05-02 $
// class description
//
@@ -56,181 +62,80 @@
#ifndef G4MultipleScatteringSTD_h
#define G4MultipleScatteringSTD_h 1
#include "G4VContinuousDiscreteProcess.hh"
#include "G4GPILSelection.hh"
#include "G4PhysicsLogVector.hh"
#include "G4VPhysicalVolume.hh"
#include "G4ParticleChangeForMSC.hh"
#include "G4UnitsTable.hh"
#include "G4VMultipleScattering.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class G4MultipleScatteringSTD : public G4VContinuousDiscreteProcess
class G4MultipleScatteringSTD : public G4VMultipleScattering
{
public: // with description
public: // with description
G4MultipleScatteringSTD(const G4String& processName="msc");
G4MultipleScatteringSTD(const G4String& processName="msc");
~G4MultipleScatteringSTD();
G4bool IsApplicable ( const G4ParticleDefinition& );
G4bool IsApplicable (const G4ParticleDefinition& p)
{return (p.GetPDGCharge() != 0.0 && !p.IsShortLived());};
// returns true for charged particles, false otherwise
void BuildPhysicsTable(const G4ParticleDefinition& aParticleType);
// This function overloads the corresponding virtual function
// of the base class G4VContinuousDiscreteProcess.
// It is invoked by the G4ParticleWithCuts()::SetCut() method.
// It prepares the table of the transport mean free paths
// for every material.
void InitialiseProcess(const G4ParticleDefinition&);
// This function initialise models
void PrintInfoDefinition();
G4double TruePathLengthLimit(const G4Track& track,
G4double& lambda,
G4double currentMinimalStep);
void PrintInfoDefinition();
// Print few lines of informations about the process: validity range,
// origine ..etc..
// Invoked by BuildPhysicsTable().
G4bool StorePhysicsTable(G4ParticleDefinition* ,
const G4String& directory, G4bool);
// store TransportMeanFreePath tables into an external file
// specified by 'directory' (must exist before invokation)
G4bool RetrievePhysicsTable(G4ParticleDefinition* ,
const G4String& directory, G4bool);
// retrieve TransportMeanFreePath tables from an external file
// specified by 'directory'
G4double AlongStepGetPhysicalInteractionLength(const G4Track&,
G4double previousStepSize,
G4double currentMinimumStep,
G4double& currentSafety,
G4GPILSelection* selection);
// The function overloads the corresponding function of the base
// class.It limits the step near to boundaries only
// and invokes the method GetContinuousStepLimit at every step.
G4double GetContinuousStepLimit(const G4Track& aTrack,
G4double previousStepSize,
G4double currentMinimumStep,
G4double& currentSafety);
// It performs the true step length --> geometrical step length
// transformation. It is invoked by the
// AlongStepGetPhysicalInteractionLength method.
G4double GetMeanFreePath(const G4Track& aTrack,
G4double previousStepSize,
G4ForceCondition* condition);
// It sets the force condition to true only
// in order to have the PostStepDoIt called at every step.
// This function overloads a virtual function of the base class.
// It is invoked by the ProcessManager of the Particle.
G4double GetTransportMeanFreePath(
G4double KineticEnergy,const G4MaterialCutsCouple* couple);
// Just a utility method to get the values of the transport
// mean free path . (It is not used inside the class.)
G4VParticleChange* AlongStepDoIt(const G4Track& aTrack,const G4Step& aStep);
// The geometrical step length --> true path length transformation
// is performed here (the inverse of the transformation done
// by GetContinuousStepLimit).
G4VParticleChange* PostStepDoIt(const G4Track& aTrack,const G4Step& aStep);
// It computes the final state of the particle: samples the
// ScatteringSTD angle and computes the lateral displacement.
// The final state is returned as a ParticleChange object.
// This function overloads a virtual function of the base class.
// It is invoked by the ProcessManager of the Particle.
void Setsamplez(G4bool value) {samplez = value;};
void Setsamplez(G4bool value) {samplez = value;};
// geom. step length distribution should be sampled or not
void Setdtrl(G4double value) {dtrl = value;};
void Setdtrl(G4double value) {dtrl = value;};
// to reduce the energy/step dependence
void SetBoundary(G4bool value) {boundary = value;};
void Setfacxsi(G4double value) {facxsi = value;
G4cout << " facxsi=" << facxsi << G4endl;};
void SetFacrange(G4double val) {facrange=val;
nsmallstep = G4int(log((cf+facrange-1.)/
facrange)/log(cf))+1 ;
G4cout << " fr=" << facrange
<< " nsmall=" << nsmallstep << G4endl ;};
void Setfacxsi(G4double value) {facxsi = value;}
void SetFacrange(G4double val) {facrange=val;
nsmallstep = G4int(log((cf+facrange-1.)/facrange)/log(cf))+1;}
// Steplimit after boundary crossing = facrange*range
// estimated nb of steps at boundary nsmallstep = 1/facrange
void SetLateralDisplacementFlag(G4bool flag) {fLatDisplFlag = flag;};
// lateral displacement to be/not to be computed
void SetNuclCorrPar(G4double val) {NuclCorrPar = val;};
void SetFactPar(G4double val) {FactPar = val;};
void SetNuclCorrPar(G4double val) {NuclCorrPar = val;};
void SetFactPar(G4double val) {FactPar = val;};
// corrs to transport cross section for high energy
protected: // with description
virtual G4double ComputeTransportCrossSection(
const G4ParticleDefinition& aParticleType,
G4double KineticEnergy,
G4double AtomicNumber,
G4double AtomicWeight);
// It computes the transport cross section.
// The transport mean free path is 1/(transport cross section).
private:
private:
// hide assignment operator as private
G4MultipleScatteringSTD & operator = (const G4MultipleScatteringSTD &right);
G4MultipleScatteringSTD ( const G4MultipleScatteringSTD &);
G4MultipleScatteringSTD & operator = (const G4MultipleScatteringSTD &right);
G4MultipleScatteringSTD ( const G4MultipleScatteringSTD &);
private: // data members
private: // data members
G4PhysicsTable* theTransportMeanFreePathTable;
G4double lowKineticEnergy;
G4double highKineticEnergy;
G4int totBins;
G4double taubig,tausmall,taulim;
G4double facrange;
G4double tlimit;
G4double tlimitmin;
G4double dtrl;
G4double NuclCorrPar;
G4double FactPar;
G4double facxsi;
G4double cf;
G4double LowestKineticEnergy;
G4double HighestKineticEnergy;
G4int TotBin;
G4int stepnolastmsc;
G4int nsmallstep;
G4int materialIndex;
G4double tLast;
G4double zLast;
// model parameters
G4bool boundary; // spec. handling near boundaries
G4double facrange,tlimit,tlimitmin,cf;
G4int stepno, stepnolastmsc, nsmallstep;
G4double laststep ;
G4GPILSelection valueGPILSelectionMSC;
G4double zmean; // z(geom.step length)
G4bool samplez ; // distribution
G4double range,T0,T1,lambda0,lambda1, // used to reduce the energy
Tlow,alam,blam,dtrl,lambdam, // (or step length) dependence
clam,zm,cthm;
// with/without lateral displacement
G4bool fLatDisplFlag;
// nuclear size effect correction
G4double NuclCorrPar;
G4double FactPar;
G4ParticleChangeForMSC fParticleChange;
G4double alfa1,alfa2,alfa3,b,xsi,c0,facxsi ; // angle distr. parameters
// facxsi : some tuning
// possibility in the tail
G4bool samplez;
G4bool boundary;
};
#include "G4MultipleScatteringSTD.icc"
#endif
@@ -1,93 +0,0 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4MultipleScatteringSTD.icc,v 1.4 2003/04/24 16:49:46 vnivanch Exp $
// GEANT4 tag $Name: geant4-05-01 $
//
//------------ G4MultipleScattering physics process ---------------------------
// by Laszlo Urban, March 2001
//
// Modified:
//
// 18-05-01 V.Ivanchenko Clean up against Linux ANSI compilation
// 23-08-01 new angle and z distribution,energy dependence reduced,
// Store,Retrieve methods commented out temporarily, L.Urban
// 27-08-01 bugfix in AlongStepDoIt, L.Urban
// 28-08-01 GetContinuousStepLimit and AlongStepDoIt moved to .cc file (mma)
// 11-09-01 G4MultipleScatteringx put as default: G4MultipleScattering (mma)
//
//------------------------------------------------------------------------------
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4bool G4MultipleScatteringSTD::IsApplicable(const G4ParticleDefinition& particle)
{
return(particle.GetPDGCharge() != 0.);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double G4MultipleScatteringSTD::AlongStepGetPhysicalInteractionLength(
const G4Track& track,
G4double previousStepSize,
G4double currentMinimumStep,
G4double& currentSafety,
G4GPILSelection* selection)
{
// get Step limit proposed by the process
G4double steplength = GetContinuousStepLimit(track,previousStepSize,
currentMinimumStep,currentSafety);
// set return value for G4GPILSelection
*selection = valueGPILSelectionMSC;
return steplength;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline G4double G4MultipleScatteringSTD::GetMeanFreePath(
const G4Track& track,
G4double,
G4ForceCondition* condition)
// it does not limit the Step size , but it sets condition to
// Forced , because the PostStepDoIt always has to be called
{
*condition = Forced;
return DBL_MAX;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
inline
G4double G4MultipleScatteringSTD::GetTransportMeanFreePath(G4double KineticEnergy,
const G4MaterialCutsCouple* couple)
{
G4bool isOut;
return (*theTransportMeanFreePathTable)
(couple->GetIndex())->GetValue(KineticEnergy,isOut);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -66,7 +66,7 @@ public:
~G4SCProcessorStand();
virtual G4std::vector<G4Track*>* SampleSecondaries(const G4Step&,
virtual std::vector<G4Track*>* SampleSecondaries(const G4Step&,
G4double& tmax,
G4double& meanLoss,
G4VEmModel*) = 0;
@@ -52,7 +52,7 @@
#define G4VEmModel_h 1
#include "globals.hh"
#include "g4std/vector"
#include <vector>
#include "G4DynamicParticle.hh"
#include "G4ParticleDefinition.hh"
#include "G4Material.hh"
@@ -102,23 +102,26 @@ public:
G4double tmin,
G4double tmax) = 0;
virtual G4std::vector<G4DynamicParticle*>* SampleSecondaries(
virtual std::vector<G4DynamicParticle*>* SampleSecondaries(
const G4MaterialCutsCouple*,
const G4DynamicParticle*,
G4double tmin,
G4double tmax) = 0;
virtual G4double GeomPathLength(G4PhysicsTable* theLambdaTable,
const G4MaterialCutsCouple* couple,
const G4ParticleDefinition* particle,
G4double& kineticEnergy,
G4double lambda,
G4double range,
G4double truePathLength) {return truePathLength;};
virtual G4double GeomPathLength(G4PhysicsTable*,
const G4MaterialCutsCouple*,
const G4ParticleDefinition*,
G4double&,
G4double,
G4double,
G4double truePathLength) {return truePathLength;};
// G4double parameters: kinEnergy, lambda, range,
// G4PhysicsTable: theLambdaTable
virtual G4double TrueStepLength(G4double geomStepLength) {return geomStepLength;};
virtual G4double SampleCosineTheta(G4double trueStepLength) {return 1.0;};
virtual G4double SampleCosineTheta(G4double ) {return 1.0; };
// G4double parrameter trueStepLength
virtual G4double SampleDisplacement() {return 0.0;};
@@ -22,7 +22,7 @@
//
//
// $Id: G4VEnergyLoss.hh,v 1.17 2003/03/25 13:36:57 maire Exp $
// GEANT4 tag $Name: geant4-05-01 $
// GEANT4 tag $Name: geant4-05-02 $
//
//
// ------------------------------------------------------------
@@ -43,6 +43,7 @@
// 26-02-03 Region dependent step limit (V.Ivanchenko)
// 26-03-03 Add GetDEDXDispersion (V.Ivanchenko)
// 09-04-03 Fix problem of negative range limit for non integral (V.Ivanchenko)
// 13-05-03 Add calculation of precise range (V.Ivanchenko)
//
// Class Description:
//
@@ -93,7 +94,7 @@ public:
G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&);
virtual G4std::vector<G4Track*>* SecondariesAlongStep(
virtual std::vector<G4Track*>* SecondariesAlongStep(
const G4Step&,
G4double& tmax,
G4double& eloss,
@@ -113,11 +114,14 @@ public:
void BuildPhysicsTable(const G4ParticleDefinition&);
// Build physics table during initialisation
virtual void PrintInfoDefinition() const;
virtual void PrintInfoDefinition();
// Print out of the class parameters
G4PhysicsTable* BuildDEDXTable();
G4PhysicsTable* BuildDEDXTableForPreciseRange();
G4PhysicsTable* BuildLambdaTable();
G4PhysicsTable* BuildLambdaSubTable();
@@ -133,23 +137,31 @@ public:
const G4ParticleDefinition* Particle() const;
const G4ParticleDefinition* BaseParticle() const;
const G4ParticleDefinition* SecondaryParticle() const;
// Print out of the class parameters
// Particle definition
void SetDEDXBinning(G4int nbins);
G4int DEDXBinning() const;
// Print out of the class parameters
// G4int DEDXBinning() const;
// Binning for dEdx, range, and inverse range tables
void SetDEDXBinningForPreciseRange(G4int nbins);
// G4int DEDXBinningForPreciseRange() const;
// Binning for dEdx, range, and inverse range tables
void SetLambdaBinning(G4int nbins);
G4int LambdaBinning() const;
// Print out of the class parameters
// G4int LambdaBinning() const;
// Binning for lambda table
void SetMinKinEnergy(G4double e);
G4double MinKinEnergy() const;
// Print out of the class parameters
// Min kinetic energy for tables
void SetMaxKinEnergy(G4double e);
G4double MaxKinEnergy() const;
// Print out of the class parameters
// Max kinetic energy for tables
void SetMaxKinEnergyForPreciseRange(G4double e);
// G4double MaxKinEnergyForPreciseRange() const;
// Max kinetic energy for tables
G4bool StorePhysicsTable(G4ParticleDefinition*,
const G4String& directory,
@@ -213,6 +225,7 @@ public:
void SetLossFluctuations(G4bool val) {lossFluctuationFlag = val;};
void SetIntegral(G4bool val) {integral = val;};
G4bool IsIntegral() const {return integral;}
void SetRandomStep(G4bool val) {rndmStepFlag = val;};
@@ -220,6 +233,8 @@ public:
void SetStepLimits(G4double v1, G4double v2);
void SetRangeCoeff(G4double val);
G4bool TablesAreBuilt() const {return tablesAreBuilt;};
G4int NumberOfSubCutoffRegions() const {return nSCoffRegions;};
@@ -256,6 +271,9 @@ protected:
virtual
G4PhysicsVector* DEDXPhysicsVector(const G4MaterialCutsCouple*);
virtual
G4PhysicsVector* DEDXPhysicsVectorForPreciseRange(const G4MaterialCutsCouple*);
virtual
G4PhysicsVector* LambdaPhysicsVector(const G4MaterialCutsCouple*);
@@ -297,10 +315,10 @@ private:
private:
G4EmModelManager* modelManager;
G4std::vector<G4VSubCutoffProcessor*> scoffProcessors;
G4std::vector<const G4Region*> scoffRegions;
std::vector<G4VSubCutoffProcessor*> scoffProcessors;
std::vector<const G4Region*> scoffRegions;
G4int nSCoffRegions;
G4std::vector<G4int> idxSCoffRegions;
std::vector<G4int> idxSCoffRegions;
// tables and vectors
G4PhysicsTable* theDEDXTable;
@@ -309,6 +327,8 @@ private:
G4PhysicsTable* theInverseRangeTable;
G4PhysicsTable* theLambdaTable;
G4PhysicsTable* theSubLambdaTable;
G4double* theDEDXAtMaxEnergy;
G4double* theRangeAtMaxEnergy;
const G4DataVector* theCuts;
@@ -324,10 +344,15 @@ private:
size_t currentMaterialIndex;
G4int nDEDXBins;
G4int nDEDXBinsForRange;
G4int nLambdaBins;
G4double faclow;
G4double minKinEnergy;
G4double maxKinEnergy;
G4double maxKinEnergyForRange;
G4double lowKinEnergy;
G4double highKinEnergyForRange;
G4double massRatio;
G4double reduceFactor;
@@ -342,6 +367,7 @@ private:
G4double minSubRange;
G4double dRoverRange;
G4double finalRange;
G4double rangeCoeff;
G4bool lossFluctuationFlag;
G4bool rndmStepFlag;
@@ -377,7 +403,7 @@ inline G4double G4VEnergyLossSTD::GetDEDX(G4double& kineticEnergy,
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
/*
inline G4double G4VEnergyLossSTD::GetRange(G4double& kineticEnergy,
const G4MaterialCutsCouple* couple)
{
@@ -387,6 +413,25 @@ inline G4double G4VEnergyLossSTD::GetRange(G4double& kineticEnergy,
GetValue(kineticEnergy*massRatio, b))*reduceFactor;
}
*/
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4VEnergyLossSTD::GetRange(G4double& kineticEnergy,
const G4MaterialCutsCouple* couple)
{
DefineMaterial(couple);
G4bool b;
G4double x;
G4double e = kineticEnergy*massRatio;
if (e < highKinEnergyForRange) {
x = ((*theRangeTable)[currentMaterialIndex])->GetValue(e, b);
} else {
x = theRangeAtMaxEnergy[currentMaterialIndex] +
(e - highKinEnergyForRange)/theDEDXAtMaxEnergy[currentMaterialIndex];
}
return x*reduceFactor;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4VEnergyLossSTD::GetKineticEnergy(G4double& range,
@@ -407,7 +452,7 @@ inline G4double G4VEnergyLossSTD::GetDEDXDispersion(
{
DefineMaterial(couple);
G4double tmax = MaxSecondaryEnergy(dp);
tmax = G4std::min(tmax,(*theCuts)[currentMaterialIndex]);
tmax = std::min(tmax,(*theCuts)[currentMaterialIndex]);
return modelManager->GetDEDXDispersion(currentMaterial, dp, tmax, length,
currentMaterialIndex);
}
@@ -438,7 +483,7 @@ inline G4double G4VEnergyLossSTD::GetMeanFreePath(const G4Track& track,
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4VEnergyLossSTD::GetContinuousStepLimit(const G4Track&,
G4double, G4double, G4double&)
G4double, G4double currentMinimumStep, G4double&)
{
G4double x = DBL_MAX;
@@ -447,10 +492,11 @@ inline G4double G4VEnergyLossSTD::GetContinuousStepLimit(const G4Track&,
fRange = ((*theRangeTable)[currentMaterialIndex])->
GetValue(preStepScaledEnergy, b)*reduceFactor;
x = fRange;
if( !integral ) {
G4double r = G4std::min(finalRange, currentCouple->GetProductionCuts()
G4double r = std::min(finalRange, currentCouple->GetProductionCuts()
->GetProductionCut(idxG4ElectronCut));
if( integral ) {
if(x < currentMinimumStep && x > r) x *= rangeCoeff;
} else {
if (fRange > r) {
x = dRoverRange*fRange + r*(1.0 - dRoverRange)*(2.0 - r/fRange);
@@ -509,11 +555,18 @@ inline void G4VEnergyLossSTD::SetDEDXBinning(G4int nbins)
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4VEnergyLossSTD::SetDEDXBinningForPreciseRange(G4int nbins)
{
nDEDXBinsForRange = nbins;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
/*
inline G4int G4VEnergyLossSTD::DEDXBinning() const
{
return nDEDXBins;
}
*/
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4VEnergyLossSTD::SetLambdaBinning(G4int nbins)
@@ -522,17 +575,18 @@ inline void G4VEnergyLossSTD::SetLambdaBinning(G4int nbins)
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
/*
inline G4int G4VEnergyLossSTD::LambdaBinning() const
{
return nLambdaBins;
}
*/
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4VEnergyLossSTD::SetMinKinEnergy(G4double e)
{
minKinEnergy = e;
lowKinEnergy = minKinEnergy*faclow;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
@@ -547,6 +601,14 @@ inline G4double G4VEnergyLossSTD::MinKinEnergy() const
inline void G4VEnergyLossSTD::SetMaxKinEnergy(G4double e)
{
maxKinEnergy = e;
if(e < maxKinEnergyForRange) maxKinEnergyForRange = e;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline void G4VEnergyLossSTD::SetMaxKinEnergyForPreciseRange(G4double e)
{
maxKinEnergyForRange = e;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
@@ -94,7 +94,7 @@ public:
// class.It limits the step near to boundaries only
// and invokes the method GetContinuousStepLimit at every step.
virtual void PrintInfoDefinition() const;
virtual void PrintInfoDefinition();
// Print out of the class parameters
void SetBinning(G4int nbins);
@@ -233,7 +233,7 @@ inline void G4VMultipleScattering::DefineMaterial(const G4MaterialCutsCouple* co
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
inline G4double G4VMultipleScattering::GetMeanFreePath(const G4Track& track,
inline G4double G4VMultipleScattering::GetMeanFreePath(const G4Track&,
G4double,
G4ForceCondition* cond)
{
@@ -50,7 +50,7 @@
#include "globals.hh"
#include "g4std/vector"
#include <vector>
class G4Step;
class G4Track;
@@ -68,7 +68,7 @@ public:
virtual ~G4VSubCutoffProcessor() {};
virtual G4std::vector<G4Track*>* SampleSecondaries(const G4Step&,
virtual std::vector<G4Track*>* SampleSecondaries(const G4Step&,
G4double& tmax,
G4double& meanLoss,
G4VEmModel*) = 0;