Import Geant4 11.0.0 source tree

This commit is contained in:
Gabriele Cosmo
2021-12-10 14:46:44 +01:00
committed by Ben Morgan
parent 6399a014b6
commit 80e2389dd8
3932 changed files with 202519 additions and 246221 deletions
@@ -1,6 +1,6 @@
#----------------------------------------------------------------------------
# Setup the project
cmake_minimum_required(VERSION 3.12...3.20)
cmake_minimum_required(VERSION 3.16...3.21)
set(name microelectronics)
project(${name})
@@ -8,6 +8,32 @@
Package History file
--------------------
25 November 2021 D. Lambert microelectronics-V10-07-07
- README and microelectronics.mac files have been updated
to focus on new improvements
22 November 2021 S. Guatelli microelectronics-V10-07-06
- ROOT file script plot.C has been updated
06 November 2021 I. Hrivnacova microelectronics-V10-07-05
- Added analysis manager Clear() call instead of
deleting in the end of run (removed on July 19)
04 Nov 2021 - D. Lambert microelectronics-V10-07-04
- Updated of the microelec example in order to
chose the new microelec model (new materials)
or the previous (only Si) model
7 October 2021 - I. Hrivnacova microelectronics-V10-07-03
- Migration to new G4AnalysisManager.hh header;
define the default output file type (root),
removed Analysis.hh.
19 July 2021 - I. Hrivnacova microelectronics-V10-07-02
- Updated for changes in the analysis category:
removed deleting of the analysis manager,
as this is now done by the Geant4 kernel.
24 May 2021 - B. Morgan (microelectronics-V10-07-01)
- Bump required CMake version range to 3.12...3.20, matching core Geant4
-105
View File
@@ -1,105 +0,0 @@
-------------------------------------------------------------------
-------------------------------------------------------------------
=========================================================
Geant4 - Microelectronics example
=========================================================
README file
----------------------
CORRESPONDING AUTHOR
M. Raine
CEA, DAM, DIF, F-91297 Arpajon, France
* e-mail:melanie.raine@cea.fr
---->0. INTRODUCTION.
The microelectronics example simulates the track of a 5 MeV proton in silicon.
Geant4 standard EM models are used in the World volume while Geant4-MicroElec models
are used in a Target volume, declared as a Region.
---->1. GEOMETRY SET-UP.
The geometry is a 1 um side cube (World) made of silicon containing a smaller cubic Target volume of silicon.
---->2. SET-UP
Make sure G4LEDATA points to the low energy electromagnetic libraries.
The variable G4ANALYSIS_USE must be set to 1.
The code should be compiled with cmake:
$ cd $HOME
$ mkdir microelectronics-build
$ cd $HOME/microelectronics-build
$ cmake -DGeant4_DIR=/your_path/geant4-install/lib64/Geant4-9.5.0 $HOME/microelectronics
$ make
It works in MT mode.
---->3. HOW TO RUN THE EXAMPLE
In interactive mode, run:
./Microelectronics
The macro microelectronics.mac is executed by default.
To get visualization, make sure to uncomment the #/control/execute vis.mac
line in the macro.
---->4. PHYSICS
This example shows:
- how to use the Geant4-MicroElec processes,
- how to affect them a name
- how to combine them with Standard EM Physics.
A simple electron capture process is also provided in order to kill electrons
below a chosen energy threshold, set in the Physics list.
Look at the PhyscisList.cc file.
---->5. SIMULATION OUTPUT AND RESULT ANALYZIS
The output results consists in a microelectronics.root file, containing for each simulation step:
- the type of particle for the current step
- the type of process for the current step
- the track position of the current step (in nanometers)
- the energy deposit along the current step (in eV)
- the step length (in nm)
- the total enery loss along the current step (in eV)
This file can be easily analyzed using for example the provided ROOT macro
file plot.C; to do so :
* be sure to have ROOT installed on your machine
* be sure to be in the microelectronics directory
* launch ROOT by typing root
* under your ROOT session, type in : .X plot.C to execute the macro file
* alternatively you can type directly under your session : root plot.C
The naming scheme on the displayed ROOT plots is as follows (see SteppingAction.cc):
-particles:
e- : 1
proton : 2
ion : 3
-processes:
e-_G4MicroElecElastic 11
e-_G4MicroElecInelastic 12
eCapture 13
p_G4MicroElecInelastic 14
ion_G4MicroElecInelastic 15
hIoni 16
eIoni 17
---------------------------------------------------------------------------
Should you have any enquiry, please do not hesitate to contact:
melanie.raine@cea.fr
@@ -25,7 +25,8 @@
//
// -------------------------------------------------------------------
// -------------------------------------------------------------------
// History :
// 21/10/2021 DLa update to manage the change of material
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#ifndef DetectorConstruction_h
@@ -45,6 +46,7 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
class G4Region;
class DetectorMessenger;
class DetectorConstruction : public G4VUserDetectorConstruction
{
@@ -56,6 +58,16 @@ public:
G4VPhysicalVolume* Construct();
void SetSize (G4double);
void SetMaterial (const G4String&);
inline const G4VPhysicalVolume* GetWorld() const {return fPhysiWorld;};
inline G4double GetSize() const {return fBoxSize;};
inline const G4Material* GetMaterial() const {return fMaterial;};
void PrintParameters();
void DefineMaterials();
G4Region* GetTargetRegion() {return fRegion;}
private:
@@ -68,10 +80,16 @@ private:
G4LogicalVolume* fLogicWorld;
G4Box* fSolidWorld;
G4Material* fSiMaterial;
G4Material* fWorldMaterial;
G4LogicalVolume* flogicTarget;
G4Box* ftargetSolid;
G4double fBoxSize;
G4Material* fMaterial;
G4Region* fRegion;
void DefineMaterials();
DetectorMessenger* fDetectorMessenger;
G4VPhysicalVolume* ConstructDetector();
};
@@ -23,11 +23,47 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
/// \file electromagnetic/TestEm1/include/DetectorMessenger.hh
/// \brief Definition of the DetectorMessenger class
//
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#ifndef Analysis_h
#define Analysis_h 1
#ifndef DetectorMessenger_h
#define DetectorMessenger_h 1
#include "g4root.hh"
#include "G4UImessenger.hh"
#include "globals.hh"
class DetectorConstruction;
class G4UIdirectory;
class G4UIcmdWithAString;
class G4UIcmdWithADoubleAndUnit;
class G4UIcmdWithoutParameter;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class DetectorMessenger: public G4UImessenger
{
public:
DetectorMessenger(DetectorConstruction* );
~DetectorMessenger();
virtual void SetNewValue(G4UIcommand*, G4String);
private:
DetectorConstruction* fDetector;
G4UIdirectory* fmicroelectronicsDir;
G4UIdirectory* fDetDir;
G4UIcmdWithAString* fMaterCmd;
G4UIcmdWithADoubleAndUnit* fSizeCmd;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -0,0 +1,102 @@
//
// ********************************************************************
// * 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. *
// ********************************************************************
//
//
//---------------------------------------------------------------------------
//
// ClassName: ElectronCapture
//
// Description: The process to kill e- to save CPU
//
// Author: V.Ivanchenko 31 August 2010
//
//----------------------------------------------------------------------------
//
// Class description:
//
// ElectronCapture allows to remove unwanted e- from simulation in
// order to improve CPU performance. There are two parameters:
//
// 1) low energy threshold for e- kinetic energy (default 0)
// 2) the name of G4Region where process is active
//
//
// If an electron track is killed then energy deposition is added to the step
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#ifndef ElectronCapture_h
#define ElectronCapture_h 1
#include "G4VDiscreteProcess.hh"
#include "globals.hh"
#include "G4ParticleChangeForGamma.hh"
class G4Region;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class ElectronCapture : public G4VDiscreteProcess
{
public:
ElectronCapture(const G4String& regName, G4double ekinlimit);
virtual ~ElectronCapture();
void SetKinEnergyLimit(G4double);
virtual void BuildPhysicsTable(const G4ParticleDefinition&);
virtual G4bool IsApplicable(const G4ParticleDefinition&);
virtual G4double PostStepGetPhysicalInteractionLength( const G4Track& track,
G4double previousStepSize,
G4ForceCondition* condition);
virtual G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&);
protected:
virtual G4double GetMeanFreePath(const G4Track&, G4double,G4ForceCondition*);
private:
// hide assignment operator as private
ElectronCapture(const ElectronCapture&);
ElectronCapture& operator = (const ElectronCapture &right);
G4double kinEnergyThreshold;
G4String regionName;
G4Region* region;
G4ParticleChangeForGamma fParticleChange;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -0,0 +1,81 @@
//
// ********************************************************************
// * 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. *
// ********************************************************************
//
// -------------------------------------------------------------------
// -------------------------------------------------------------------
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#ifndef MicroElecPhysics_h
#define MicroElecPhysics_h 1
#include "G4VUserPhysicsList.hh"
#include "G4ProcessManager.hh"
#include "G4ParticleTypes.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
class MicroElecPhysics: public G4VUserPhysicsList
{
public:
MicroElecPhysics();
virtual ~MicroElecPhysics();
void SetGammaCut(G4double);
void SetElectronCut(G4double);
void SetPositronCut(G4double);
void SetProtonCut(G4double);
protected:
// these methods construct particles
void ConstructBosons();
void ConstructLeptons();
void ConstructBarions();
// these methods construct physics processes and register them
void ConstructGeneral();
void ConstructEM();
// Construct particle and physics
void ConstructParticle();
void ConstructProcess();
// set cuts
void SetCuts();
private:
G4double cutForGamma;
G4double cutForElectron;
G4double cutForPositron;
G4double cutForProton;
};
#endif
@@ -0,0 +1,81 @@
//
// ********************************************************************
// * 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. *
// ********************************************************************
//
// -------------------------------------------------------------------
// -------------------------------------------------------------------
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#ifndef MicroElecSiPhysics_h
#define MicroElecSiPhysics_h 1
#include "G4VUserPhysicsList.hh"
#include "G4ProcessManager.hh"
#include "G4ParticleTypes.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
class MicroElecSiPhysics: public G4VUserPhysicsList
{
public:
MicroElecSiPhysics();
virtual ~MicroElecSiPhysics();
void SetGammaCut(G4double);
void SetElectronCut(G4double);
void SetPositronCut(G4double);
void SetProtonCut(G4double);
protected:
// these methods construct particles
void ConstructBosons();
void ConstructLeptons();
void ConstructBarions();
// these methods construct physics processes and register them
void ConstructGeneral();
void ConstructEM();
// Construct particle and physics
void ConstructParticle();
void ConstructProcess();
// set cuts
void SetCuts();
private:
G4double cutForGamma;
G4double cutForElectron;
G4double cutForPositron;
G4double cutForProton;
};
#endif
@@ -25,7 +25,10 @@
//
// -------------------------------------------------------------------
// -------------------------------------------------------------------
//
// history :
// 21/10/2021 : DLa update in order to manage G4MicroElecSiPhysics (previous model)
// and G4MicroElecPhysics (new model)
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#include "G4Types.hh"
@@ -35,33 +38,56 @@
#include "G4VisExecutive.hh"
#include "ActionInitialization.hh"
#include "DetectorConstruction.hh"
#include "PhysicsList.hh"
#include "G4GenericPhysicsList.hh"
#include "G4EmStandardPhysics.hh"
#include "MicroElecSiPhysics.hh"
#include "MicroElecPhysics.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
int main(int argc,char** argv)
{
G4UIExecutive* session = NULL;
G4UIExecutive* session = nullptr;
if (argc==1) // Define UI session for interactive mode.
{
session = new G4UIExecutive(argc, argv);
}
// Choose the Random engine
G4Random::setTheEngine(new CLHEP::RanecuEngine);
// Construct the default run manager
auto* runManager = G4RunManagerFactory::CreateRunManager();
G4int nThreads = 4;
G4int nThreads = 1; // the new MicroElec works better with only one thread
runManager->SetNumberOfThreads(nThreads);
// Set mandatory user initialization classes
DetectorConstruction* detector = new DetectorConstruction;
runManager->SetUserInitialization(detector);
runManager->SetUserInitialization(new PhysicsList);
// Management of the MicroElec only Si
// and the new MicroElec
G4String fileName;
fileName = "microelectronics.mac";
G4bool microElecSiPhysics;
microElecSiPhysics=false;
if(argc>1)
{
if (G4String(argv[1])== "-onlySi") {microElecSiPhysics=true;}
else {fileName=argv[1]; }
if( argc>2)
{
if (G4String(argv[2])== "-onlySi"){ microElecSiPhysics=true;}
else{ fileName=argv[2];}
}
}
if (microElecSiPhysics)
{ G4cout << "Physic list : MicroElecSiPhysics (only Silicium)" << G4endl;
runManager->SetUserInitialization(new MicroElecSiPhysics());
}
else
{ G4cout << "Physic list : MicroElecPhysics" << G4endl;
runManager->SetUserInitialization(new MicroElecPhysics());
}
// User action initialization
runManager->SetUserInitialization(new ActionInitialization(detector));
@@ -84,7 +110,6 @@ int main(int argc,char** argv)
else // Batch mode
{
G4String command = "/control/execute ";
G4String fileName = argv[1];
UImanager->ApplyCommand(command+fileName);
}
@@ -1,6 +1,6 @@
/tracking/verbose 0
/run/verbose 2
/process/eLoss/verbose 1
/process/em/verbose 1
/run/initialize
/gun/particle proton
/gun/energy 50 MeV
@@ -1,12 +1,26 @@
/control/execute vis.mac
/tracking/verbose 0
#/gun/particle ion
#/gun/ion 20 48 15
/gun/particle proton
/gun/energy 5 MeV
#/run/numberOfThreads 2 #if MT is activated
/run/initialize
/run/beamOn 2
/control/execute vis.mac
/tracking/verbose 0
#/microelectronics/det/setMat G4_Ag
#/microelectronics/det/setMat G4_Al
#/microelectronics/det/setMat G4_C
#/microelectronics/det/setMat G4_Cu
#/microelectronics/det/setMat G4_Ge
#/microelectronics/det/setMat G4_KAPTON
#/microelectronics/det/setMat G4_Ni
#/microelectronics/det/setMat G4_Si # default material
#/microelectronics/det/setMat G4_SILICON_DIOXIDE
#/microelectronics/det/setMat G4_Ti
#/microelectronics/det/setMat G4_W
#/gun/particle ion
#/gun/ion 20 48 15
/gun/particle proton
/gun/energy 5 MeV
#/run/numberOfThreads 2 #if MT is activated
/run/initialize
/run/beamOn 2
@@ -11,7 +11,7 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo
**************************************************************
Geant4 version Name: geant4-10-07-ref-06 (25-June-2021)
Geant4 version Name: geant4-11-00-ref-00 (10-December-2021)
Copyright : Geant4 Collaboration
References : NIM A 506 (2003), 250-303
: IEEE-TNS 53 (2006), 270-278
@@ -19,9 +19,10 @@ Environment variable "G4FORCE_RUN_MANAGER_TYPE" enabled with value == Serial. Fo
WWW : http://geant4.org/
**************************************************************
Physic list : MicroElecPhysics
### === G4UAtomicDeexcitation::InitialiseForNewRun()
PhysicsList::SetCuts:CutLength : 1 um
MicroElecPhysics::SetCuts:CutLength : 1 um
Visualization Manager instantiating with verbosity "warnings (3)"...
Visualization Manager initialising...
Registering graphics systems...
@@ -30,10 +31,8 @@ You have successfully registered the following graphics systems.
Registered graphics systems are:
ASCIITree (ATree)
DAWNFILE (DAWNFILE)
G4HepRep (HepRepXML)
G4HepRepFile (HepRepFile)
RayTracer (RayTracer)
VRML1FILE (VRML1FILE)
VRML2FILE (VRML2FILE)
gMocrenFile (gMocrenFile)
OpenGLImmediateQt (OGLIQt, OGLI)
@@ -75,6 +74,84 @@ End of Run User Vis Actions: none
Some /vis commands (optionally) take a string to specify colour.
"/vis/list" to see available colours.
=======================================================================
====== Electromagnetic Physics Parameters ========
=======================================================================
LPM effect enabled 1
Enable creation and use of sampling tables 0
Apply cuts on all EM processes 0
Use general process 0
Enable linear polarisation for gamma 0
Enable sampling of quantum entanglement 0
X-section factor for integral approach 0.8
Min kinetic energy for tables 100 meV
Max kinetic energy for tables 10 TeV
Number of bins per decade of a table 20
Verbose level 1
Verbose level for worker thread 0
Bremsstrahlung energy threshold above which
primary e+- is added to the list of secondary 100 TeV
Bremsstrahlung energy threshold above which primary
muon/hadron is added to the list of secondary 100 TeV
Lowest triplet kinetic energy 1 MeV
Enable sampling of gamma linear polarisation 0
5D gamma conversion model type 0
5D gamma conversion model on isolated ion 0
Livermore data directory livermore
=======================================================================
====== Ionisation Parameters ========
=======================================================================
Step function for e+- (0.2, 1 mm)
Step function for muons/hadrons (0.2, 0.1 mm)
Step function for light ions (0.2, 0.1 mm)
Step function for general ions (0.2, 0.1 mm)
Lowest e+e- kinetic energy 0 eV
Lowest muon/hadron kinetic energy 1 keV
Fluctuations of dE/dx are enabled 1
Use ICRU90 data 0
Use built-in Birks satuaration 0
Build CSDA range enabled 0
Use cut as a final range enabled 0
Enable angular generator interface 1
Max kinetic energy for CSDA tables 1 GeV
Max kinetic energy for NIEL computation 0 eV
Linear loss limit 0.01
Read data from file for e+e- pair production by mu 0
=======================================================================
====== Multiple Scattering Parameters ========
=======================================================================
Type of msc step limit algorithm for e+- 1
Type of msc step limit algorithm for muons/hadrons 0
Msc lateral displacement for e+- enabled 1
Msc lateral displacement for muons and hadrons 0
Urban msc model lateral displacement alg96 1
Range factor for msc step limit for e+- 0.04
Range factor for msc step limit for muons/hadrons 0.2
Geometry factor for msc step limitation of e+- 2.5
Safety factor for msc step limit for e+- 0.6
Skin parameter for msc step limitation of e+- 1
Lambda limit for msc step limit for e+- 1 mm
Use Mott correction for e- scattering 0
Factor used for dynamic computation of angular
limit between single and multiple scattering 1
Fixed angular limit between single
and multiple scattering 3.1416 rad
Upper energy limit for e+- multiple scattering 100 MeV
Type of electron single scattering model 0
Type of nuclear form-factor 1
Screening factor 1
=======================================================================
====== Atomic Deexcitation Parameters ========
=======================================================================
Fluorescence enabled 1
Fluorescence Bearden data files enabled 0
Fluorescence ANSTO data files enabled 0
Auger electron cascade enabled 1
PIXE atomic de-excitation enabled 0
De-excitation module ignores cuts 0
Type of PIXE cross section for hadrons Empirical
Type of PIXE cross section for e+- Livermore
=======================================================================
### === Deexcitation model UAtomDeexcitation is activated for 2 regions:
DefaultRegionForTheWorld 1 1 1
@@ -85,87 +162,126 @@ Some /vis commands (optionally) take a string to specify colour.
### === Ignore cuts flag: 0
### === PIXE model for hadrons: Empirical
### === PIXE model for e+-: Livermore
****************************
mermin model loaded !
Material 1 / 2 : G4_Si
Material 2 / 2 : G4_Si
****************************
mermin model loaded !
Material 1 / 2 : G4_Si
Inelastic/mermin_sigma_inelastic_e-_Si
loaddata : Inelastic/mermin_sigma_inelastic_e-_Si
Faster code = true
Inelastic/cumulated_mermin_sigmadiff_inelastic_e-_Si.dat
add to material vector
Material 2 / 2 : G4_Si
Inelastic/mermin_sigma_inelastic_e-_Si
loaddata : Inelastic/mermin_sigma_inelastic_e-_Si
Faster code = true
Inelastic/cumulated_mermin_sigmadiff_inelastic_e-_Si.dat
add to material vector
****************************
mermin model loaded !
Material 1 / 2 : G4_Si
Inelastic/mermin_sigma_inelastic_p_Si
loaddata : Inelastic/mermin_sigma_inelastic_p_Si
Faster code = true
Inelastic/cumulated_mermin_sigmadiff_inelastic_p_Si.dat
Material 2 / 2 : G4_Si
Inelastic/mermin_sigma_inelastic_p_Si
loaddata : Inelastic/mermin_sigma_inelastic_p_Si
Faster code = true
Inelastic/cumulated_mermin_sigmadiff_inelastic_p_Si.dat
msc: for e- SubType= 10
===== EM models for the G4Region DefaultRegionForTheWorld ======
UrbanMsc : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV
UrbanMsc : Emin= 0 eV Emax= 10 TeV Nbins=220 100 eV - 10 TeV
StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm
===== EM models for the G4Region Target ======
UrbanMsc : Emin= 100 MeV Emax= 100 TeV Nbins=42 100 MeV - 100 TeV
UrbanMsc : Emin= 100 MeV Emax= 10 TeV Nbins=100 100 MeV - 10 TeV
StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm
eIoni: for e- XStype:1 SubType=2
dE/dx and range tables from 100 eV to 100 TeV in 84 bins
Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1
dE/dx and range tables from 100 meV to 10 TeV in 280 bins
Lambda tables from threshold to 10 TeV, 20 bins/decade, spline: 1
StepFunction=(0.2, 1 mm), integ: 1, fluct: 1, linLossLim= 0.01
===== EM models for the G4Region DefaultRegionForTheWorld ======
MollerBhabha : Emin= 0 meV Emax= 100 TeV
MollerBhabha : Emin= 0 eV Emax= 10 TeV deltaVI
===== EM models for the G4Region Target ======
MollerBhabha : Emin= 100 MeV Emax= 10 TeV
MollerBhabha : Emin= 10 MeV Emax= 10 TeV deltaVI
e-_G4MicroElecElastic: for e- SubType=51 BuildTable=0
===== EM models for the G4Region DefaultRegionForTheWorld ======
DummyModel : Emin= 0 meV Emax= 100 TeV
DummyModel : Emin= 0 eV Emax= 10 TeV
StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm
===== EM models for the G4Region Target ======
MicroElecElasticModel : Emin= 0 meV Emax= 100 MeV
MicroElecElasticModel : Emin= 0 eV Emax= 500 keV
e-_G4MicroElecInelastic: for e- SubType=53 BuildTable=0
e-_G4Dielectrics: for e- SubType=53 BuildTable=0
===== EM models for the G4Region DefaultRegionForTheWorld ======
DummyModel : Emin= 0 meV Emax= 100 TeV
DummyModel : Emin= 0 eV Emax= 10 TeV
StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm
===== EM models for the G4Region Target ======
MicroElecInelasticModel : Emin= 0 meV Emax= 100 MeV deltaVI Fluo
MicroElecInelasticModel : Emin= 0 eV Emax= 10 MeV deltaVI Fluo
msc: for proton SubType= 10
e-_G4LOPhononScattering: for e- SubType=51 BuildTable=0
===== EM models for the G4Region DefaultRegionForTheWorld ======
UrbanMsc : Emin= 0 meV Emax= 100 TeV Nbins=84 100 eV - 100 TeV
StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm
DummyModel : Emin= 0 eV Emax= 10 TeV
StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm
===== EM models for the G4Region Target ======
G4MicroElecLOPhononModel : Emin= 0 eV Emax= 10 MeV
G4MicroElecSurface::Initialise: Ncouples= 2
G4Surface, Material 1 / 2 : G4_Si
G4Surface, Material 2 / 2 : G4_Si
hIoni: for proton XStype:1 SubType=2
dE/dx and range tables from 100 eV to 100 TeV in 84 bins
Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1
dE/dx and range tables from 100 meV to 10 TeV in 280 bins
Lambda tables from threshold to 10 TeV, 20 bins/decade, spline: 1
StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.01
===== EM models for the G4Region DefaultRegionForTheWorld ======
Bragg : Emin= 0 meV Emax= 2 MeV
BetheBloch : Emin= 2 MeV Emax= 100 TeV
Bragg : Emin= 0 eV Emax= 2 MeV deltaVI
BetheBloch : Emin= 2 MeV Emax= 10 TeV deltaVI
===== EM models for the G4Region Target ======
Bragg : Emin= 0 meV Emax= 2 MeV
BetheBloch : Emin= 10 GeV Emax= 10 TeV
BetheBloch : Emin= 10 MeV Emax= 10 TeV deltaVI
p_G4MicroElecInelastic: for proton SubType=53 BuildTable=0
p_G4Dielectrics: for proton SubType=53 BuildTable=0
===== EM models for the G4Region DefaultRegionForTheWorld ======
DummyModel : Emin= 0 meV Emax= 100 TeV
DummyModel : Emin= 0 eV Emax= 10 TeV
StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm
===== EM models for the G4Region Target ======
MicroElecInelasticModel : Emin= 50 keV Emax= 10 GeV deltaVI Fluo
DummyModel : Emin= 10 GeV Emax= 10 TeV
StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm
msc: for GenericIon SubType= 10
===== EM models for the G4Region DefaultRegionForTheWorld ======
UrbanMsc : Emin= 0 meV Emax= 100 TeV
StepLim=Minimal Rfact=0.2 Gfact=2.5 Sfact=0.6 DispFlag:0 Skin=1 Llim=1 mm
MicroElecInelasticModel : Emin= 100 eV Emax= 10 MeV deltaVI Fluo
ionIoni: for GenericIon XStype:1 SubType=2
dE/dx and range tables from 100 eV to 100 TeV in 84 bins
Lambda tables from threshold to 100 TeV, 7 bins/decade, spline: 1
dE/dx and range tables from 100 meV to 10 TeV in 280 bins
Lambda tables from threshold to 10 TeV, 20 bins/decade, spline: 1
StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02
Stopping Power data for 17 ion/material pairs
===== EM models for the G4Region DefaultRegionForTheWorld ======
BraggIon : Emin= 0 meV Emax= 2 MeV
BetheBloch : Emin= 2 MeV Emax= 100 TeV
BraggIon : Emin= 0 eV Emax= 2 MeV deltaVI
BetheBloch : Emin= 2 MeV Emax= 10 TeV deltaVI
===== EM models for the G4Region Target ======
BraggIon : Emin= 0 meV Emax= 2 MeV
BetheBloch : Emin= 10 GeV Emax= 10 TeV
BetheBloch : Emin= 10 MeV Emax= 10 TeV deltaVI
ion_G4MicroElecInelastic: for GenericIon SubType=53 BuildTable=0
ion_G4Dielectrics: for GenericIon SubType=53 BuildTable=0
===== EM models for the G4Region DefaultRegionForTheWorld ======
DummyModel : Emin= 0 meV Emax= 100 TeV
DummyModel : Emin= 0 eV Emax= 10 TeV
StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm
===== EM models for the G4Region Target ======
MicroElecInelasticModel : Emin= 50 keV Emax= 10 GeV deltaVI Fluo
DummyModel : Emin= 10 GeV Emax= 10 TeV
MicroElecInelasticModel : Emin= 100 eV Emax= 10 MeV deltaVI Fluo
ionIoni: for alpha XStype:1 SubType=2
dE/dx and range tables from 100 meV to 10 TeV in 280 bins
Lambda tables from threshold to 10 TeV, 20 bins/decade, spline: 1
StepFunction=(0.2, 0.1 mm), integ: 1, fluct: 1, linLossLim= 0.02
===== EM models for the G4Region DefaultRegionForTheWorld ======
BraggIon : Emin= 0 eV Emax=7.9452 MeV deltaVI
BetheBloch : Emin=7.9452 MeV Emax= 10 TeV deltaVI
===== EM models for the G4Region Target ======
BetheBloch : Emin= 10 MeV Emax= 10 TeV deltaVI
alpha_G4Dielectrics: for alpha SubType=53 BuildTable=0
===== EM models for the G4Region DefaultRegionForTheWorld ======
DummyModel : Emin= 0 eV Emax= 10 TeV
StepLim=UseSafety Rfact=0.04 Gfact=2.5 Sfact=0.6 DispFlag:1 Skin=1 Llim=1 mm
Region <DefaultRegionForTheWorld> -- -- appears in <World> world volume
@@ -193,14 +309,14 @@ Region <Target> -- -- appears in <World> world volume
Index : 0 used in the geometry : Yes
Material : G4_Si
Range cuts : gamma 1 um e- 1 um e+ 1 um proton 1 um
Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 100 eV
Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 100 eV
Region(s) which use this couple :
DefaultRegionForTheWorld
Index : 1 used in the geometry : Yes
Material : G4_Si
Range cuts : gamma 1 nm e- 1 nm e+ 1 nm proton 1 nm
Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 100 meV
Energy thresholds : gamma 1 keV e- 1 keV e+ 1 keV proton 100 meV
Region(s) which use this couple :
Target
@@ -214,20 +330,37 @@ G4GeometryManager::ReportVoxelStats -- Voxel Statistics
G4VisManager: Using G4TrajectoryDrawByCharge as fallback trajectory model.
See commands in /vis/modeling/trajectories/ for other options.
### Run 0 starts.
##### Create analysis manager 0x19ac820
Using Root analysis manager
##### Create analysis manager 0x13a89a0
Using analysis manager
... set ntuple merging row mode : row-wise - done
... create file : microelectronics.root - done
... open analysis file : microelectronics.root - done
... open analysis file : microelectronics.root - done
Calling G4MicroElecElasticModel_new::Initialise()
MicroElasticModel, Material 1 / 2 : G4_Si
Si
Reading TCS file
Elastic Total Cross file : Elastic/elsepa_elastic_cross_e_Si
loaddata : Elastic/elsepa_elastic_cross_e_Si
Elastic Cumulated Diff Cross : /cvmfs/geant4.cern.ch/share/data/G4EMLOW8.0/microelec/Elastic/elsepa_elastic_cumulated_diffcross_e_Si.dat
MicroElasticModel, Material 2 / 2 : G4_Si
Si
Reading TCS file
Elastic Total Cross file : Elastic/elsepa_elastic_cross_e_Si
loaddata : Elastic/elsepa_elastic_cross_e_Si
Elastic Cumulated Diff Cross : /cvmfs/geant4.cern.ch/share/data/G4EMLOW8.0/microelec/Elastic/elsepa_elastic_cumulated_diffcross_e_Si.dat
Run terminated.
Run Summary
Number of events processed : 10
User=0.000000s Real=0.004297s Sys=0.000000s
User=0.260000s Real=0.286508s Sys=0.010000s
... write file : microelectronics.root - done
... close file : microelectronics.root - done
... clear all data - done
Number and type of particles created outside region "Target" :
N e- : 1
_______________________
Number and type of particles created in region "Target" :
N e- : 130
N e- : 891
0 events have been kept for refreshing and/or reviewing.
"/vis/reviewKeptEvents" to review them one by one.
"/vis/enable", then "/vis/viewer/flush" or "/vis/viewer/rebuild" to see them accumulated.
@@ -254,12 +387,12 @@ Pool ID '24G4ReferenceCountedHandleIvE', size : 0.000961 MB
Pool ID '7G4Event', size : 0.000961 MB
Pool ID '15G4PrimaryVertex', size : 0.000961 MB
Pool ID '17G4PrimaryParticle', size : 0.000961 MB
Pool ID '17G4DynamicParticle', size : 0.00481 MB
Pool ID '7G4Track', size : 0.00865 MB
Pool ID '17G4DynamicParticle', size : 0.00769 MB
Pool ID '7G4Track', size : 0.0154 MB
Pool ID '18G4TouchableHistory', size : 0.000961 MB
Pool ID '15G4CountedObjectIvE', size : 0.000961 MB
Number of memory pools allocated: 9 of which, static: 0
Dynamic pools deleted: 9 / Total memory freed: 0.027 MB
Dynamic pools deleted: 9 / Total memory freed: 0.037 MB
============================================================
G4Allocator objects are deleted.
UImanager deleted.
+6 -6
View File
@@ -10,17 +10,17 @@ gROOT->SetStyle("Plain");
Double_t scale;
c1 = new TCanvas ("c1","",20,20,1000,500);
c1.Divide(2,1);
c1->Divide(2,1);
system ("rm -rf microelectronics.root");
system ("hadd microelectronics.root microelectronics_*.root");
//system ("rm -rf microelectronics.root");
//system ("hadd microelectronics.root microelectronics_*.root");
TFile f("microelectronics.root");
TNtuple* ntuple;
ntuple = (TNtuple*)f->Get("microelectronics");
ntuple = (TNtuple*)f.Get("microelectronics");
c1.cd(1);
c1->cd(1);
gStyle->SetOptStat(000000);
// All
@@ -37,7 +37,7 @@ c1.cd(1);
gPad->SetLogy();
c1.cd(2);
c1->cd(2);
// Electrons
ntuple->SetMarkerColor(2);
@@ -23,24 +23,43 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// History :
// 21/10/2021 : DLa update to modify the material and the size
// -------------------------------------------------------------------
// -------------------------------------------------------------------
#include "DetectorConstruction.hh"
#include "DetectorMessenger.hh"
#include "G4SystemOfUnits.hh"
#include "G4Region.hh"
#include "G4ProductionCuts.hh"
#include "G4RunManager.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
DetectorConstruction::DetectorConstruction()
:fPhysiWorld(NULL), fLogicWorld(NULL), fSolidWorld(NULL)
{}
:G4VUserDetectorConstruction(), fPhysiWorld(nullptr), fLogicWorld(nullptr), fSolidWorld(nullptr), fWorldMaterial(nullptr), flogicTarget(nullptr), ftargetSolid(nullptr), fMaterial(nullptr), fRegion(nullptr)
{
fBoxSize = 1.0*um;
DefineMaterials();
SetMaterial("G4_Si");
fDetectorMessenger = new DetectorMessenger(this);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
DetectorConstruction::~DetectorConstruction()
{}
{
delete fPhysiWorld;
delete fLogicWorld;
delete fSolidWorld;
//delete fWorldMaterial; // no delete because link to database
delete flogicTarget;
delete ftargetSolid;
delete fMaterial;
delete fRegion;
delete fDetectorMessenger;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
@@ -58,31 +77,59 @@ void DetectorConstruction::DefineMaterials()
// Silicon is defined from NIST material database
G4NistManager * man = G4NistManager::Instance();
G4Material * Si = man->FindOrBuildMaterial("G4_Si");
// Default materials in setup.
fSiMaterial = Si;
fMaterial = man->FindOrBuildMaterial("G4_Si");
fWorldMaterial = man->FindOrBuildMaterial("G4_Si"); // world material;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void DetectorConstruction::SetMaterial(const G4String& materialChoice)
{
// search the material by its name
G4Material* pttoMaterial =
G4NistManager::Instance()->FindOrBuildMaterial(materialChoice);
if (pttoMaterial) {
fMaterial = pttoMaterial;
if ( flogicTarget ) { flogicTarget->SetMaterial(fMaterial); }
} else {
G4cout << "\n--> warning from DetectorConstruction::SetMaterial : "
<< materialChoice << " not found" << G4endl;
}
G4RunManager::GetRunManager()->PhysicsHasBeenModified();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4VPhysicalVolume* DetectorConstruction::ConstructDetector()
{
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
// WORLD VOLUME
fWorldSizeX = 1*um;
fWorldSizeY = 1*um;
fWorldSizeZ = 1*um;
G4double TargetSizeX = 1*um;
G4double TargetSizeY = TargetSizeX;
G4double TargetSizeZ = TargetSizeX;
fBoxSize = TargetSizeX;
fWorldSizeX = TargetSizeX*2;
fWorldSizeY = TargetSizeY*2;
fWorldSizeZ = TargetSizeZ*2;
fSolidWorld = new G4Box("World", //its name
fWorldSizeX/2,fWorldSizeY/2,fWorldSizeZ/2); //its size
fLogicWorld = new G4LogicalVolume(fSolidWorld, //its solid
fSiMaterial, //its material
fWorldMaterial, //its material
"World"); //its name
fPhysiWorld = new G4PVPlacement(0, //no rotation
@@ -93,20 +140,20 @@ G4VPhysicalVolume* DetectorConstruction::ConstructDetector()
false, //no boolean operation
0); //copy number
G4double TargetSizeZ = 0.2*um;
G4Box* targetSolid = new G4Box("Target", //its name
fWorldSizeX/2,fWorldSizeY/2,TargetSizeZ/2); //its size
ftargetSolid = new G4Box("Target", //its name
TargetSizeX/2,TargetSizeY/2,TargetSizeZ/2); //its size
G4LogicalVolume* logicTarget = new G4LogicalVolume(targetSolid, //its solid
fSiMaterial, //its material
flogicTarget = new G4LogicalVolume(ftargetSolid, //its solid
fMaterial, //its material
"Target"); //its name
new G4PVPlacement(0, //no rotation
G4ThreeVector(), //at (0,0,0)
"Target", //its name
logicTarget, //its logical volume
flogicTarget, //its logical volume
fPhysiWorld, //its mother volume
false, //no boolean operation
0); //copy number
@@ -118,7 +165,7 @@ G4VPhysicalVolume* DetectorConstruction::ConstructDetector()
G4VisAttributes* worldVisAtt1 = new G4VisAttributes(G4Colour(1.0,0.0,0.0));
worldVisAtt1->SetVisibility(true);
logicTarget->SetVisAttributes(worldVisAtt1);
flogicTarget->SetVisAttributes(worldVisAtt1);
// Create Target G4Region and add logical volume
@@ -133,7 +180,31 @@ G4VPhysicalVolume* DetectorConstruction::ConstructDetector()
cuts->SetProductionCut(defCut,"proton");
fRegion->SetProductionCuts(cuts);
fRegion->AddRootLogicalVolume(logicTarget);
fRegion->AddRootLogicalVolume(flogicTarget);
return fPhysiWorld;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void DetectorConstruction::SetSize(G4double value)
{
fBoxSize = value;
if(ftargetSolid) {
ftargetSolid->SetXHalfLength(fBoxSize/2);
ftargetSolid->SetYHalfLength(fBoxSize/2);
ftargetSolid->SetZHalfLength(fBoxSize/2);
}
fWorldSizeX = value*2.0;
fWorldSizeY = value*2.0;
fWorldSizeZ = value*2.0;
if(fSolidWorld) {
fSolidWorld->SetXHalfLength(fWorldSizeX/2);
fSolidWorld->SetYHalfLength(fWorldSizeY/2);
fSolidWorld->SetZHalfLength(fWorldSizeZ/2);
}
}
@@ -0,0 +1,94 @@
//
// ********************************************************************
// * 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. *
// ********************************************************************
//
/// \file electromagnetic/microelectronics1/src/DetectorMessenger.cc
/// \brief Implementation of the DetectorMessenger class
//
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "DetectorMessenger.hh"
#include "DetectorConstruction.hh"
#include "G4UIdirectory.hh"
#include "G4UIcmdWithAString.hh"
#include "G4UIcmdWithADoubleAndUnit.hh"
#include "G4UIcmdWithoutParameter.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
DetectorMessenger::DetectorMessenger(DetectorConstruction * Det)
:G4UImessenger(),fDetector(Det),
fmicroelectronicsDir(0),
fDetDir(0),
fMaterCmd(0),
fSizeCmd(0)
{
fmicroelectronicsDir = new G4UIdirectory("/microelectronics/");
fmicroelectronicsDir->SetGuidance("commands specific to this example");
fDetDir = new G4UIdirectory("/microelectronics/det/");
fDetDir->SetGuidance("detector construction commands");
fMaterCmd = new G4UIcmdWithAString("/microelectronics/det/setMat",this);
fMaterCmd->SetGuidance("Select material of the box.");
fMaterCmd->SetParameterName("choice",false);
fMaterCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
fMaterCmd->SetToBeBroadcasted(false);
fSizeCmd = new G4UIcmdWithADoubleAndUnit("/microelectronics/det/setSize",this);
fSizeCmd->SetGuidance("Set size of the box");
fSizeCmd->SetParameterName("Size",false);
fSizeCmd->SetRange("Size>0.");
fSizeCmd->SetUnitCategory("Length");
fSizeCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
fSizeCmd->SetToBeBroadcasted(false);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
DetectorMessenger::~DetectorMessenger()
{
delete fMaterCmd;
delete fSizeCmd;
delete fDetDir;
delete fmicroelectronicsDir;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void DetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue)
{
if( command == fMaterCmd )
{ fDetector->SetMaterial(newValue);}
if( command == fSizeCmd )
{ fDetector->SetSize(fSizeCmd->GetNewDoubleValue(newValue));}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -0,0 +1,133 @@
//
// ********************************************************************
// * 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. *
// ********************************************************************
//
//
//---------------------------------------------------------------------------
//
// ClassName: ElectronCapture
//
// Description: The process to kill particles to save CPU
//
// Author: V.Ivanchenko 31 August 2010
//
//----------------------------------------------------------------------------
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "ElectronCapture.hh"
#include "G4SystemOfUnits.hh"
#include "G4ParticleDefinition.hh"
#include "G4Step.hh"
#include "G4Track.hh"
#include "G4Region.hh"
#include "G4RegionStore.hh"
#include "G4Electron.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
ElectronCapture::ElectronCapture(const G4String& regName, G4double ekinlim)
: G4VDiscreteProcess("eCapture", fElectromagnetic), kinEnergyThreshold(ekinlim),
regionName(regName), region(0)
{
if(regName == "" || regName == "world") {
regionName = "DefaultRegionForTheWorld";
}
pParticleChange = &fParticleChange;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
ElectronCapture::~ElectronCapture()
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void ElectronCapture::SetKinEnergyLimit(G4double val)
{
kinEnergyThreshold = val;
if(verboseLevel > 0) {
G4cout << "### ElectronCapture: Tracking cut E(MeV) = "
<< kinEnergyThreshold/MeV << G4endl;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void ElectronCapture::BuildPhysicsTable(const G4ParticleDefinition&)
{
region = (G4RegionStore::GetInstance())->GetRegion(regionName);
if(region && verboseLevel > 0) {
G4cout << "### ElectronCapture: Tracking cut E(MeV) = "
<< kinEnergyThreshold/MeV << " is assigned to " << regionName
<< G4endl;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4bool ElectronCapture::IsApplicable(const G4ParticleDefinition&)
{
return true;
}
G4double
ElectronCapture::PostStepGetPhysicalInteractionLength(const G4Track& aTrack,
G4double,
G4ForceCondition* condition)
{
// condition is set to "Not Forced"
*condition = NotForced;
G4double limit = DBL_MAX;
if(region) {
if(aTrack.GetVolume()->GetLogicalVolume()->GetRegion() == region &&
aTrack.GetKineticEnergy() < kinEnergyThreshold) { limit = 0.0; }
}
return limit;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4VParticleChange* ElectronCapture::PostStepDoIt(const G4Track& aTrack,
const G4Step&)
{
pParticleChange->Initialize(aTrack);
pParticleChange->ProposeTrackStatus(fStopAndKill);
pParticleChange->ProposeLocalEnergyDeposit(aTrack.GetKineticEnergy());
fParticleChange.SetProposedKineticEnergy(0.0);
return pParticleChange;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4double ElectronCapture::GetMeanFreePath(const G4Track&,G4double,
G4ForceCondition*)
{
return DBL_MAX;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -0,0 +1,424 @@
//
// ********************************************************************
// * 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. *
// ********************************************************************
//
// -------------------------------------------------------------------
// -------------------------------------------------------------------
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#include "MicroElecPhysics.hh"
#include "G4SystemOfUnits.hh"
// Geant4-MicroElec MODELS
#include "G4MicroElecElastic.hh"
#include "G4MicroElecElasticModel_new.hh"
#include "G4MicroElecInelastic.hh"
#include "G4MicroElecInelasticModel_new.hh"
#include "G4MicroElecLOPhononScattering.hh"
#include "G4MicroElecLOPhononModel.hh"
#include "G4MicroElecSurface.hh"
//
#include "G4LossTableManager.hh"
#include "G4EmConfigurator.hh"
#include "G4VEmModel.hh"
#include "G4DummyModel.hh"
#include "G4eIonisation.hh"
#include "G4hIonisation.hh"
#include "G4ionIonisation.hh"
#include "G4eMultipleScattering.hh"
#include "G4hMultipleScattering.hh"
#include "G4BraggModel.hh"
#include "G4BraggIonModel.hh"
#include "G4BetheBlochModel.hh"
#include "G4UrbanMscModel.hh"
#include "G4MollerBhabhaModel.hh"
#include "G4IonFluctuations.hh"
#include "G4UniversalFluctuation.hh"
#include "ElectronCapture.hh"
#include "G4UAtomicDeexcitation.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
MicroElecPhysics::MicroElecPhysics(): G4VUserPhysicsList()
{
defaultCutValue = 1*micrometer;
cutForGamma = defaultCutValue;
cutForElectron = defaultCutValue;
cutForPositron = defaultCutValue;
cutForProton = defaultCutValue;
SetVerboseLevel(1);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
MicroElecPhysics::~MicroElecPhysics()
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecPhysics::ConstructParticle()
{
ConstructBosons();
ConstructLeptons();
ConstructBarions();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecPhysics::ConstructBosons()
{
// gamma
G4Gamma::GammaDefinition();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecPhysics::ConstructLeptons()
{
// leptons
G4Electron::ElectronDefinition();
G4Positron::PositronDefinition();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecPhysics::ConstructBarions()
{
// baryons
G4Proton::ProtonDefinition();
G4GenericIon::GenericIonDefinition();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecPhysics::ConstructProcess()
{
AddTransportation();
ConstructEM();
ConstructGeneral();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecPhysics::ConstructEM()
{
G4EmParameters* param = G4EmParameters::Instance();
//param->SetDefaults();
param->SetBuildCSDARange(true);
//param->SetMscStepLimitType(fUseSafetyPlus);
//param->SetMscStepLimitType(fUseDistanceToBoundary);
param->SetMscStepLimitType(fUseSafety);
param->RegionsMicroElec();
// physicList ISS
param->SetDefaults();
param->SetMinEnergy(0.1*eV);
param->SetMaxEnergy(10 * TeV);
param->SetLowestElectronEnergy(0 * eV); //<--- Energie de cut dans le vide!!! A fixer 0eV pour ne pas fausser les SEY
param->SetNumberOfBinsPerDecade(20);
param->ActivateAngularGeneratorForIonisation(true);
param->SetAugerCascade(true);//*/
auto particleIterator=GetParticleIterator();
particleIterator->reset();
while( (*particleIterator)() )
{
G4ParticleDefinition* particle = particleIterator->value();
G4ProcessManager* pmanager = particle->GetProcessManager();
G4String particleName = particle->GetParticleName();
// *********************************
// 1) Processes for the World region
// *********************************
if (particleName == "e-") {
// STANDARD msc is active in the world
G4eMultipleScattering* msc = new G4eMultipleScattering();
msc->AddEmModel(1, new G4UrbanMscModel());
pmanager->AddProcess(msc, -1, 1, -1);
// STANDARD ionisation is active in the world
G4eIonisation* eion = new G4eIonisation();
pmanager->AddProcess(eion, -1, 2, 2);
// MicroElec elastic is not active in the world
//G4MicroElecElasticCorrected* theMicroElecElasticProcess = new G4MicroElecElasticCorrected("e-_G4MicroElecElastic");
//theMicroElecElasticProcess->SetEmModel(new G4DummyModel(),1);
//pmanager->AddDiscreteProcess(theMicroElecElasticProcess);
G4MicroElecElastic* theMicroElecElasticProcess = new G4MicroElecElastic("e-_G4MicroElecElastic");
theMicroElecElasticProcess->SetEmModel(new G4DummyModel(),1);
// G4MicroElecElasticModel_new* mod = new G4MicroElecElasticModel_new();
//theMicroElecElasticProcess->AddEmModel(0,mod);
pmanager->AddDiscreteProcess(theMicroElecElasticProcess);
// MicroElec ionisation is not active in the world
/*G4MicroElecInelastic* microelecioni = new G4MicroElecInelastic("e-_G4MicroElecInelastic");
microelecioni->SetEmModel(new G4DummyModel(),1);
pmanager->AddDiscreteProcess(microelecioni);*/
G4MicroElecInelastic* microelecioni = new G4MicroElecInelastic("e-_G4Dielectrics");
microelecioni->SetEmModel(new G4DummyModel(),1);
pmanager->AddDiscreteProcess(microelecioni);
//Phonons for SiO2
G4MicroElecLOPhononScattering* opticalPhonon = new G4MicroElecLOPhononScattering("e-_G4LOPhononScattering");
opticalPhonon->SetEmModel(new G4DummyModel(), 1);
pmanager->AddDiscreteProcess(opticalPhonon);
/*G4LOPhononScattering* LO60 = new G4LOPhononScattering("e-_G4LO60");
LO60->SetEmModel(new G4DummyModel(), 1);
pmanager->AddDiscreteProcess(LO60);//*/
G4MicroElecSurface* MicroElecSurf = new G4MicroElecSurface("e-_G4MicroElecSurface");
MicroElecSurf->SetProcessManager(pmanager);
pmanager->AddDiscreteProcess(MicroElecSurf);//*/
ElectronCapture* ecap = new ElectronCapture("Target",0.9*eV); //<--- Piges pour Al2O3
pmanager->AddDiscreteProcess(ecap);//*/
} else if ( particleName == "proton" ) {
// STANDARD msc is active in the world
/*G4hMultipleScattering* msc = new G4hMultipleScattering();
msc->AddEmModel(1, new G4UrbanMscModel());
pmanager->AddProcess(msc, -1, 1, -1);*/
// STANDARD ionisation is active in the world
G4hIonisation* hion = new G4hIonisation();
pmanager->AddProcess(hion, -1, 2, 2);
// Dielectric ionisation is not active in the world
G4MicroElecInelastic* dielectricioni = new G4MicroElecInelastic("p_G4Dielectrics");
dielectricioni->SetEmModel(new G4DummyModel(),1);
//dielectricioni->SetEmModel(new G4DummyModel(),2);
pmanager->AddDiscreteProcess(dielectricioni);
} else if(particleName == "alpha") {
// STANDARD ionisation is active in the world
G4ionIonisation* hion = new G4ionIonisation();
pmanager->AddProcess(hion, -1, 2, 2);
// Dielectric ionisation is not active in the world
G4MicroElecInelastic* dielectricioni = new G4MicroElecInelastic("alpha_G4Dielectrics");
dielectricioni->SetEmModel(new G4DummyModel(),1);
dielectricioni->SetEmModel(new G4DummyModel(),2);
pmanager->AddDiscreteProcess(dielectricioni);
} else if (particleName == "GenericIon") {
// STANDARD msc is active in the world
/*G4hMultipleScattering* msc = new G4hMultipleScattering();
msc->AddEmModel(1, new G4UrbanMscModel());
pmanager->AddProcess(new G4hMultipleScattering, -1, 1, -1);*/
/*G4CoulombScattering* cs = new G4CoulombScattering();
cs->AddEmModel(0, new G4IonCoulombScatteringModel());
cs->SetBuildTableFlag(false);
pmanager->AddDiscreteProcess(cs);*/
// STANDARD ionisation is active in the world
G4ionIonisation* hion = new G4ionIonisation();
pmanager->AddProcess(hion, -1, 2, 2);
// Dielectric ionisation is not actived in the world
G4MicroElecInelastic* dielectricioni = new G4MicroElecInelastic("ion_G4Dielectrics");
dielectricioni->SetEmModel(new G4DummyModel(),1);
dielectricioni->SetEmModel(new G4DummyModel(),2);
pmanager->AddDiscreteProcess(dielectricioni);
}
}
// **************************************
// 2) Define processes for Target region
// **************************************
// STANDARD EM processes should be inactivated when corresponding MicroElec processes are used
// - STANDARD EM e- processes are inactivated below 100 MeV
// - STANDARD EM proton & ion processes are inactivated below standEnergyLimit
//
G4EmConfigurator* em_config = G4LossTableManager::Instance()->EmConfigurator();
G4VEmModel* mod;
// *** e-
// ---> STANDARD EM processes are inactivated below 100 MeV
G4UrbanMscModel* msc = new G4UrbanMscModel();
msc->SetActivationLowEnergyLimit(100*MeV);
em_config->SetExtraEmModel("e-","msc",msc,"Target");
mod = new G4MollerBhabhaModel();
mod->SetActivationLowEnergyLimit(10*MeV);
em_config->SetExtraEmModel("e-","eIoni",mod,"Target",0.0,10*TeV, new G4UniversalFluctuation());
// ---> MicroElec processes activated
mod = new G4MicroElecElasticModel_new();
em_config->SetExtraEmModel("e-","e-_G4MicroElecElastic",mod,"Target",0.1*eV,100*MeV);
mod = new G4MicroElecInelasticModel_new();
em_config->SetExtraEmModel("e-","e-_G4Dielectrics",mod,"Target",0.1*eV,10*MeV);
// G4double hw = 0.15*eV;
//Old phonon
/*mod = new LOPhononModel(0.153*eV,false);
em_config->SetExtraEmModel("e-", "e-_G4LOPhononScattering", mod, "Target", 0.153*eV, 10 * MeV);
mod = new LOPhononModel(0.063*eV,false);
em_config->SetExtraEmModel("e-", "e-_G4LO60", mod, "Target", 0.06*eV, 10 * MeV);//*/
//Phonons LO pour sio2 et al2o3
mod = new G4MicroElecLOPhononModel();
em_config->SetExtraEmModel("e-", "e-_G4LOPhononScattering", mod, "Target", 0.1 * eV, 10 * MeV);//*/
// *** proton ----------------------------------------------------------
// ---> STANDARD EM processes inactivated below standEnergyLimit
// STANDARD msc is still active
// Inactivate following STANDARD processes
// il faut desactiver Bragg puisque notre modle descend en-dessous de 50 keV
/*mod = new G4BraggModel();
mod->SetActivationHighEnergyLimit(50*keV);
em_config->SetExtraEmModel("proton","hIoni",mod,"Target",0.0,2*MeV, new G4IonFluctuations());*/
mod = new G4BetheBlochModel();
mod->SetActivationLowEnergyLimit(10*MeV);
em_config->SetExtraEmModel("proton","hIoni",mod,"Target",2*MeV,10*TeV, new G4IonFluctuations());
// ---> Dielectric processes activated
mod = new G4MicroElecInelasticModel_new();
mod->SetActivationLowEnergyLimit(100*eV);
em_config->SetExtraEmModel("proton","p_G4Dielectrics",mod,"Target",100*eV,10*MeV);
//em_config->SetExtraEmModel("proton","p_G4Dielectrics",new G4DummyModel,"Target",10*MeV,10*TeV);
//*/
// *** alpha ----------------------------------------------------------
mod = new G4BetheBlochModel();
mod->SetActivationLowEnergyLimit(10*MeV);
em_config->SetExtraEmModel("alpha","ionIoni",mod,"Target",10*MeV,10*TeV, new G4IonFluctuations());
/*mod = new G4MicroElecInelasticModel_new();
//mod->SetActivationLowEnergyLimit(100*eV);
em_config->SetExtraEmModel("alpha","alpha_G4Dielectrics",mod,"Target",0.0,10*MeV);//*/
// *** ion ----------------------------------------------------------
// ---> STANDARD EM processes inactivated below standEnergyLimit
// STANDARD msc is still active
// Inactivate following STANDARD processes
/*mod = new G4BraggIonModel();
mod->SetActivationHighEnergyLimit(50*keV);
em_config->SetExtraEmModel("GenericIon","ionIoni",mod,"Target",0.0,2*MeV, new G4IonFluctuations());*/
mod = new G4BetheBlochModel();
mod->SetActivationLowEnergyLimit(10*MeV);
em_config->SetExtraEmModel("GenericIon","ionIoni",mod,"Target",10*MeV,10*TeV, new G4IonFluctuations());
// ---> Dielectric processes activated
mod = new G4MicroElecInelasticModel_new();
mod->SetActivationLowEnergyLimit(100*eV);
em_config->SetExtraEmModel("GenericIon","ion_G4Dielectrics",mod,"Target",0.0,10*MeV);
//em_config->SetExtraEmModel("GenericIon","ion_G4Dielectrics",new G4DummyModel,"Target",10*GeV,10*TeV);
// Deexcitation
//
G4VAtomDeexcitation* de = new G4UAtomicDeexcitation();
G4LossTableManager::Instance()->SetAtomDeexcitation(de);
de->SetFluo(true);
de->SetAuger(true);
de->SetPIXE(true);
de->InitialiseForNewRun();
// G4ProductionCutsTable::GetProductionCutsTable()->SetEnergyRange(5*eV, 100.0*GeV);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecPhysics::ConstructGeneral()
{ }
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecPhysics::SetCuts()
{
if (verboseLevel >0)
{
G4cout << "MicroElecPhysics::SetCuts:";
G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl;
}
// set cut values for gamma at first and for e- second and next for e+,
// because some processes for e+/e- need cut values for gamma
SetCutValue(cutForGamma, "gamma");
SetCutValue(cutForElectron, "e-");
SetCutValue(cutForPositron, "e+");
SetCutValue(cutForProton, "proton");
if (verboseLevel>0) { DumpCutValuesTable(); }
}
@@ -0,0 +1,317 @@
//
// ********************************************************************
// * 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. *
// ********************************************************************
//
// -------------------------------------------------------------------
// -------------------------------------------------------------------
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#include "MicroElecSiPhysics.hh"
#include "G4SystemOfUnits.hh"
// Geant4-MicroElec MODELS
#include "G4MicroElecElastic.hh"
#include "G4MicroElecElasticModel.hh"
#include "G4MicroElecInelastic.hh"
#include "G4MicroElecInelasticModel.hh"
//
#include "G4LossTableManager.hh"
#include "G4EmConfigurator.hh"
#include "G4VEmModel.hh"
#include "G4DummyModel.hh"
#include "G4eIonisation.hh"
#include "G4hIonisation.hh"
#include "G4ionIonisation.hh"
#include "G4eMultipleScattering.hh"
#include "G4hMultipleScattering.hh"
#include "G4BraggModel.hh"
#include "G4BraggIonModel.hh"
#include "G4BetheBlochModel.hh"
#include "G4UrbanMscModel.hh"
#include "G4MollerBhabhaModel.hh"
#include "G4IonFluctuations.hh"
#include "G4UniversalFluctuation.hh"
#include "ElectronCapture.hh"
#include "G4UAtomicDeexcitation.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
MicroElecSiPhysics::MicroElecSiPhysics(): G4VUserPhysicsList()
{
defaultCutValue = 1*micrometer;
cutForGamma = defaultCutValue;
cutForElectron = defaultCutValue;
cutForPositron = defaultCutValue;
cutForProton = defaultCutValue;
SetVerboseLevel(1);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
MicroElecSiPhysics::~MicroElecSiPhysics()
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecSiPhysics::ConstructParticle()
{
ConstructBosons();
ConstructLeptons();
ConstructBarions();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecSiPhysics::ConstructBosons()
{
// gamma
G4Gamma::GammaDefinition();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecSiPhysics::ConstructLeptons()
{
// leptons
G4Electron::ElectronDefinition();
G4Positron::PositronDefinition();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecSiPhysics::ConstructBarions()
{
// baryons
G4Proton::ProtonDefinition();
G4GenericIon::GenericIonDefinition();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecSiPhysics::ConstructProcess()
{
AddTransportation();
ConstructEM();
ConstructGeneral();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecSiPhysics::ConstructEM()
{
auto particleIterator=GetParticleIterator();
particleIterator->reset();
while( (*particleIterator)() )
{
G4ParticleDefinition* particle = particleIterator->value();
G4ProcessManager* pmanager = particle->GetProcessManager();
G4String particleName = particle->GetParticleName();
// *********************************
// 1) Processes for the World region
// *********************************
if (particleName == "e-") {
// STANDARD msc is active in the world
G4eMultipleScattering* msc = new G4eMultipleScattering();
msc->AddEmModel(1, new G4UrbanMscModel());
pmanager->AddProcess(msc, -1, 1, -1);
// STANDARD ionisation is active in the world
G4eIonisation* eion = new G4eIonisation();
pmanager->AddProcess(eion, -1, 2, 2);
// MicroElec elastic is not active in the world
G4MicroElecElastic* theMicroElecElasticProcess = new G4MicroElecElastic("e-_G4MicroElecElastic");
theMicroElecElasticProcess->SetEmModel(new G4DummyModel());
pmanager->AddDiscreteProcess(theMicroElecElasticProcess);
// MicroElec ionisation is not active in the world
G4MicroElecInelastic* microelecioni = new G4MicroElecInelastic("e-_G4MicroElecInelastic");
microelecioni->SetEmModel(new G4DummyModel());
pmanager->AddDiscreteProcess(microelecioni);
// THE FOLLOWING PROCESS WILL KILL ALL ELECTRONS BELOW A SELECTED ENERY THRESHOLD
// Capture of low-energy e-
ElectronCapture* ecap = new ElectronCapture("Target", 16.7*eV);
pmanager->AddDiscreteProcess(ecap);
} else if ( particleName == "proton" ) {
// STANDARD msc is active in the world
G4hMultipleScattering* msc = new G4hMultipleScattering();
msc->AddEmModel(1, new G4UrbanMscModel());
pmanager->AddProcess(msc, -1, 1, -1);
// STANDARD ionisation is active in the world
G4hIonisation* hion = new G4hIonisation();
pmanager->AddProcess(hion, -1, 2, 2);
// MicroElec ionisation is not active in the world
G4MicroElecInelastic* microelecioni = new G4MicroElecInelastic("p_G4MicroElecInelastic");
microelecioni->SetEmModel(new G4DummyModel());
microelecioni->SetEmModel(new G4DummyModel());
pmanager->AddDiscreteProcess(microelecioni);
} else if (particleName == "GenericIon") {
// STANDARD msc is active in the world
G4hMultipleScattering* msc = new G4hMultipleScattering();
msc->AddEmModel(1, new G4UrbanMscModel());
pmanager->AddProcess(new G4hMultipleScattering, -1, 1, -1);
// STANDARD ionisation is active in the world
G4ionIonisation* hion = new G4ionIonisation();
pmanager->AddProcess(hion, -1, 2, 2);
// MicroElec ionisation is not active in the world
G4MicroElecInelastic* microelecioni = new G4MicroElecInelastic("ion_G4MicroElecInelastic");
microelecioni->SetEmModel(new G4DummyModel());
microelecioni->SetEmModel(new G4DummyModel());
pmanager->AddDiscreteProcess(microelecioni);
}
}
// **************************************
// 2) Define processes for Target region
// **************************************
// STANDARD EM processes should be inactivated when corresponding MicroElec processes are used
// - STANDARD EM e- processes are inactivated below 100 MeV
// - STANDARD EM proton & ion processes are inactivated below standEnergyLimit
//
G4EmConfigurator* em_config = G4LossTableManager::Instance()->EmConfigurator();
G4VEmModel* mod;
// *** e-
// ---> STANDARD EM processes are inactivated below 100 MeV
G4UrbanMscModel* msc = new G4UrbanMscModel();
msc->SetActivationLowEnergyLimit(100*MeV);
em_config->SetExtraEmModel("e-","msc",msc,"Target");
mod = new G4MollerBhabhaModel();
mod->SetActivationLowEnergyLimit(100*MeV);
em_config->SetExtraEmModel("e-","eIoni",mod,"Target",0.0,10*TeV, new G4UniversalFluctuation());
// ---> MicroElec processes activated
mod = new G4MicroElecElasticModel();
em_config->SetExtraEmModel("e-","e-_G4MicroElecElastic",mod,"Target",0.0,100*MeV);
mod = new G4MicroElecInelasticModel();
em_config->SetExtraEmModel("e-","e-_G4MicroElecInelastic",mod,"Target",16.7*eV,100*MeV);
// *** proton
// ---> STANDARD EM processes inactivated below standEnergyLimit
// STANDARD msc is still active
// Inactivate following STANDARD processes
mod = new G4BraggModel();
mod->SetActivationHighEnergyLimit(50*keV);
em_config->SetExtraEmModel("proton","hIoni",mod,"Target",0.0,2*MeV, new G4IonFluctuations());
mod = new G4BetheBlochModel();
mod->SetActivationLowEnergyLimit(10*GeV);
em_config->SetExtraEmModel("proton","hIoni",mod,"Target",2*MeV,10*TeV, new G4IonFluctuations());
// ---> MicroElec processes activated
mod = new G4MicroElecInelasticModel();
mod->SetActivationLowEnergyLimit(50*keV);
em_config->SetExtraEmModel("proton","p_G4MicroElecInelastic",mod,"Target",0.0,10*GeV);
em_config->SetExtraEmModel("proton","p_G4MicroElecInelastic",new G4DummyModel,
"Target",10*GeV,10*TeV);
// *** ion
// ---> STANDARD EM processes inactivated below standEnergyLimit
// STANDARD msc is still active
// Inactivate following STANDARD processes
mod = new G4BraggIonModel();
mod->SetActivationHighEnergyLimit(50*keV);
em_config->SetExtraEmModel("GenericIon","ionIoni",mod,"Target",0.0,2*MeV, new G4IonFluctuations());
mod = new G4BetheBlochModel();
mod->SetActivationLowEnergyLimit(10*GeV);
em_config->SetExtraEmModel("GenericIon","ionIoni",mod,"Target",2*MeV,10*TeV, new G4IonFluctuations());
// ---> MicroElec processes activated
mod = new G4MicroElecInelasticModel();
mod->SetActivationLowEnergyLimit(50*keV);
em_config->SetExtraEmModel("GenericIon","ion_G4MicroElecInelastic",mod,
"Target",0.0,10*GeV);
em_config->SetExtraEmModel("GenericIon","ion_G4MicroElecInelastic",new G4DummyModel,
"Target",10*GeV,10*TeV);
// Deexcitation
//
G4VAtomDeexcitation* de = new G4UAtomicDeexcitation();
G4LossTableManager::Instance()->SetAtomDeexcitation(de);
de->SetFluo(true);
de->SetAuger(true);
de->SetPIXE(true);
de->InitialiseForNewRun();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecSiPhysics::ConstructGeneral()
{ }
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void MicroElecSiPhysics::SetCuts()
{
if (verboseLevel >0)
{
G4cout << "MicroElecSiPhysics::SetCuts:";
G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl;
}
// set cut values for gamma at first and for e- second and next for e+,
// because some processes for e+/e- need cut values for gamma
SetCutValue(cutForGamma, "gamma");
SetCutValue(cutForElectron, "e-");
SetCutValue(cutForPositron, "e+");
SetCutValue(cutForProton, "proton");
if (verboseLevel>0) { DumpCutValuesTable(); }
}
@@ -31,7 +31,7 @@
#include "TrackingAction.hh"
#include "G4ParticleDefinition.hh"
#include "G4RunManager.hh"
#include "Analysis.hh"
#include "G4AnalysisManager.hh"
#include "G4Threading.hh"
void PrintNParticles(std::map<const G4ParticleDefinition*, int>& container);
@@ -153,12 +153,13 @@ void RunAction::EndWorker(const G4Run* run)
// Write Histo
//
WriteHistogram();
///////////////
// Complete cleanup
//
delete G4AnalysisManager::Instance();
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
analysisManager->Clear();
///////////////
// Printouts
//
@@ -211,6 +212,7 @@ void RunAction::CreateHistogram()
G4cout << "##### Create analysis manager " << " " << this << G4endl;
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
analysisManager->SetDefaultFileType("root");
G4cout << "Using " << analysisManager->GetType() << " analysis manager" << G4endl;
@@ -28,13 +28,12 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#include "Analysis.hh"
#include "SteppingAction.hh"
#include "RunAction.hh"
#include "DetectorConstruction.hh"
#include "PrimaryGeneratorAction.hh"
#include "G4AnalysisManager.hh"
#include "G4SystemOfUnits.hh"
#include "G4SteppingManager.hh"
#include "G4VTouchable.hh"