Tcnicas de Simulacin
3. Geant4
Dr. Willy H. Gerber
Instituto de Fisica
Universidad Austral
Valdivia, Chile
Objetiv
os:
1
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
Estructura de archivos
Demo
Include
ExDetectorConstruction.hh
ExPhysicsList.hh
ExPrimaryGeneratorActi
src on.hh
ExDetectorConstruction.cc
ExPhysicsList.cc
ExPrimaryGeneratorActi
on.cc
MainDemo.cc
2
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
Programas Geant4
Includes
necesarios
int main(int argc,char** argv)
{
Setear
runManager
Definir
Output
Ejecutar
Proceso
delete visManager;
delete runManager;
return 0;
}
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
Estructuras a incluir
#include
#include
#include
#include
"G4RunManager.hh"
"G4UImanager.hh"
"G4UIterminal.hh"
"G4VisExecutive.hh"
#include "ExDetectorConstruction.hh"
#include "ExPhysicsList.hh"
#include "ExPrimaryGeneratorAction.hh
#include ExRunAction.hh"
#include ExEventAction.hh"
#include ExSteppingAction.hh"
#include G4templates.hh"
4
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPrimaryGeneratorAction);
ExRunAction);
ExEventAction);
ExSteppingAction);
5
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
Inicializacion runManager
Inicializacion del
Display
G4UImanager* UI = G4UImanager::GetUIpointer();
UI->ApplyCommand("/run/verbose 1");
UI->ApplyCommand("/event/verbose 1");
UI->ApplyCommand("/tracking/verbose 1");
Inicializacion
G4VisManager* visManager = new G4VisExecutive;
visManager->Initialize();
Inicializacion el
sistema
runManager->Initialize();
6
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
Ejecutar
Ejecucin
int numberOfEvent = 3;
runManager->BeamOn(numberOfEvent);
if(argc==1)
// Define (G)UI terminal for interactive mode
{
G4UIsession * session = new G4UIterminal;
UI->ApplyCommand("/control/execute prerun.g4mac");
session->sessionStart();
delete session;
} else
// Batch mode
{
G4String command = "/control/execute ";
G4String fileName = argv[1];
UI->ApplyCommand(command+fileName);
}
7
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
Includes y Subrutinas
Includes y
Subrutinas
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExDetectorConstruction - demo
ExDetectorConstruc
tion
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExDetectorConstruction
Lgica de la rutina con solo 2 elementos
Crear caja (volumen World)
Crear cilindro
Crear volumen lgico para caja
Crear volumen lgico para cilindro
Posicionar cilindro
Posicionar caja
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExDetectorConstruction - demo
Crear caja clase G4Box (volumen World)
G4double expHall_x = 3.0*m;
G4double expHall_y = 1.0*m;
G4double expHall_z = 1.0*m;
innerRadiusOfTheTube = 0.*cm;
outerRadiusOfTheTube = 60.*cm;
hightOfTheTube = 25.*cm;
startAngleOfTheTube = 0.*deg;
spanningAngleOfTheTube = 360.*deg;
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExDetectorConstruction - demo
Crear volumen lgico para caja clase G4LogicalVolume
G4LogicalVolume* experimentalHall_log =
new G4LogicalVolume(experimentalHall_box,Ar,"expHall_log");
Posicionar cilindroc
G4double trackerPos_x = -1.0*meter;
G4double trackerPos_y = 0.0*meter;
G4double trackerPos_z = 0.0*meter;
ExDetectorConstruction - demo
Posicionar caja clase
G4LogicalVolume
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExDetectorConstruction - demo
Material (directo)
G4double density = 1.390*g/cm3;
G4double a = 39.95*g/mole;
G4Material* lAr = new G4Material(name="liquidArgon", z=18., a, density);
G4LogicalVolume* myLbox = new G4LogicalVolume(aBox,lAr,"Lbox",0,0,0);
Elementos
a = 1.01*g/mole;
G4Element* elH = new G4Element(name="Hydrogen",symbol="H" , z= 1., a);
a = 16.00*g/mole;
G4Element* elO = new G4Element(name="Oxygen" ,symbol="O" , z= 8., a);
density = 1.000*g/cm3;
ExDetectorConstruction - demo
Elementos
a = 14.01*g/mole;
G4Element* elN = new G4Element(name="Nitrogen",symbol="N" , z= 7., a);
a = 16.00*g/mole;
G4Element* elO = new G4Element(name="Oxygen" ,symbol="O" , z= 8., a);
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
class G4LogicalVolume;
class G4VPhysicalVolume;
#include
"G4VUserDetectorConstruction.hh"
class ExDetectorConstruction : public
G4VUserDetectorConstruction
{
public:
ExDetectorConstruction();
~ExDetectorConstruction();
G4VPhysicalVolume* Construct();
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
private:
// Logical volumes
//
G4LogicalVolume*
G4LogicalVolume*
G4LogicalVolume*
G4LogicalVolume*
experimentalHall_log;
tracker_log;
calorimeterBlock_log;
calorimeterLayer_log;
// Physical volumes
//
G4VPhysicalVolume*
experimentalHall_phys;
G4VPhysicalVolume*
calorimeterLayer_phys;
G4VPhysicalVolume*
calorimeterBlock_phys;
G4VPhysicalVolume* tracker_phys;
};
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
"G4Material.hh"
"G4Box.hh"
"G4Tubs.hh"
"G4LogicalVolume.hh"
"G4ThreeVector.hh"
"G4PVPlacement.hh"
"globals.hh"
ExDetectorConstruction::ExDetectorConstruction
()
: experimentalHall_log(0), tracker_log(0),
calorimeterBlock_log(0),
calorimeterLayer_log(0),
experimentalHall_phys(0),
calorimeterLayer_phys(0),
calorimeterBlock_phys(0), tracker_phys(0)
{;}
ExDetectorConstruction::~ExDetectorConstructi
on()
{
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
G4VPhysicalVolume* ExN01DetectorConstruction::Construct()
{
//------------------------------------------------------ materials
G4double a; // atomic mass
G4double z; // atomic number
G4double density;
G4Material* Ar = new G4Material("ArgonGas", z= 18., a= 39.95*g/mole, density=
1.782*mg/cm3);
G4Material* Al = new G4Material("Aluminum", z= 13., a= 26.98*g/mole, density=
2.7*g/cm3);
G4Material* Pb = new G4Material("Lead", z= 82., a= 207.19*g/mole, density=
11.35*g/cm3);
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
//------------------------------------------------------ volumes
//------------------------------ experimental hall (world volume)
//------------------------------ beam line along x axis
G4double expHall_x = 3.0*m;
G4double expHall_y = 1.0*m;
G4double expHall_z = 1.0*m;
G4Box* experimentalHall_box = new
G4Box("expHall_box",expHall_x,expHall_y,expHall_z);
experimentalHall_log = new G4LogicalVolume(experimentalHall_box,
Ar,"expHall_log",0,0,0);
experimentalHall_phys = new G4PVPlacement(0,G4ThreeVector(),
experimentalHall_log,"expHall",0,false,0);
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
innerRadiusOfTheTube = 0.*cm;
outerRadiusOfTheTube = 60.*cm;
hightOfTheTube = 50.*cm;
startAngleOfTheTube = 0.*deg;
spanningAngleOfTheTube = 360.*deg;
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPhysicsList
ExPhysicsLi
st
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
Definicin de partculas
G4String
G4double
G4double
G4double
G4double
G4double
G4int
G4int
G4double
G4double
G4int
G4String
G4String
G4int
G4int
G4int
G4int
GetParticleName()
particle name
GetPDGMass()
mass
GetPDGWidth()
decay width
GetPDGCharge()
electric charge
GetPDGSpin()
spin
GetPDGMagneticMoment()
magnetic moment (a)
GetPDGiParity()
parity (b)
GetPDGiConjugation() charge conjugation (b)
GetPDGIsospin()
iso-spin
GetPDGIsospin3()
3rd-component of iso-spin
GetPDGiGParity()
G-parity (0:not defined)
GetParticleType()
particle type
GetParticleSubType()
particle sub-type
GetLeptonNumber()
lepton number
GetBaryonNumber()
baryon number
GetPDGEncoding()
particle encoding number by PDG
GetAntiPDGEncoding() encoding for anti-particle of this particle
Definicin de partculas
G4bool
G4double
G4DecayTa
ble
GetPDGStable(
)
GetPDGLifeTim
e()
*GetDecayTabl
e()
stable
flag
life time
decay
table
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
Variables dinmicas
G4double
theDynamicalMass
dynamical mass
G4ThreeVector
theMomentumDirection
normalized momentum vector
G4ParticleDefinition
*theParticleDefinition definition of particle
G4double
theDynamicalSpin
dynamical spin (1)
G4ThreeVector
thePolarization
polarization vector
G4double
theMagneticMoment dynamical magnetic moment (2)
G4double
theKineticEnergy
kinetic energy
G4double
theProperTime
proper time
G4double
theDynamicalCharge dynamical electric charge (3)
G4ElectronOccupancy
*theElectronOccupancy
electron orbits for ions
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPhysicsList - demo
ExPhysicsList.hh
protected:
// Construct particle and physics
void ConstructParticle();
void ConstructProcess();
void SetCuts();
// these methods Construct particles
void ConstructBosons();
void ConstructLeptons();
void ConstructMesons();
void ConstructBaryons();
protected:
// these methods Construct physics processes and
register them
void ConstructGeneral();
void ConstructEM();
void AddStepMax();
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPhysicsList - demo
ExPhysicsList.cc
#include "ExPhysicsList.hh"
#include "G4ProcessManager.hh"
#include "G4ParticleTypes.hh"
void ExPhysicsList::ConstructParticle()
{
G4Proton::ProtonDefinition();
ConstructBosons();
ConstructLeptons();
ConstructMesons();
ConstructBaryons();
G4Geantino::GeantinoDefinition();
}
void ExPhysicsList::ConstructBosons()
{
G4Geantino::GeantinoDefinition(); // pseudoparticles
G4ChargedGeantino::ChargedGeantinoDefinition();
G4Gamma::GammaDefinition();
// gamma
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPhysicsList - demo
void ExPhysicsList::ConstructLeptons()
{
G4Electron::ElectronDefinition(); // eG4Positron::PositronDefinition(); // e+
Construir todos de una vez:
G4MuonPlus::MuonPlusDefinition(); // mu+
G4LeptonConstructor pConstructo
G4MuonMinus::MuonMinusDefinition(); // mupConstructor.ConstructParticle();
G4NeutrinoE::NeutrinoEDefinition(); // nu_e
G4AntiNeutrinoE::AntiNeutrinoEDefinition(); // nu_e
G4NeutrinoMu::NeutrinoMuDefinition(); // nu_mu
G4AntiNeutrinoMu::AntiNeutrinoMuDefinition(); // nu_mu
}
void ExPhysicsList::ConstructBaryons()
{
G4Proton::ProtonDefinition();
G4AntiProton::AntiProtonDefinition();
G4Neutron::NeutronDefinition();
G4AntiNeutron::AntiNeutronDefinition();
}
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPhysicsList - demo
void ExPhysicsList::ConstructMesons()
{
G4PionPlus::PionPlusDefinition();
G4PionMinus::PionMinusDefinition();
G4PionZero::PionZeroDefinition();
G4Eta::EtaDefinition();
G4EtaPrime::EtaPrimeDefinition();
G4KaonPlus::KaonPlusDefinition();
G4KaonMinus::KaonMinusDefinition();
G4KaonZero::KaonZeroDefinition();
G4AntiKaonZero::AntiKaonZeroDefinition();
G4KaonZeroLong::KaonZeroLongDefinition();
G4KaonZeroShort::KaonZeroShortDefinition();
}
void ExPhysicsList::ConstructProcess()
{
AddTransportation();
ConstructEM();
ConstructGeneral();
AddStepMax();
}
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPhysicsList - demo
#include "G4ComptonScattering.hh"
#include "G4GammaConversion.hh"
#include "G4PhotoElectricEffect.hh"
#include "G4eMultipleScattering.hh"
#include "G4hMultipleScattering.hh"
#include "G4eIonisation.hh"
#include "G4eBremsstrahlung.hh"
#include "G4eplusAnnihilation.hh"
#include "G4MuIonisation.hh"
#include "G4MuBremsstrahlung.hh"
#include "G4MuPairProduction.hh"
#include "G4hIonisation.hh"
#include "G4hBremsstrahlung.hh"
#include "G4hPairProduction.hh"
#include "G4ionIonisation.hh"
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPhysicsList - demo
void ExN02PhysicsList::ConstructEM()
{
theParticleIterator->reset();
while( (*theParticleIterator)() ){
G4ParticleDefinition* particle = theParticleIterator->value();
G4ProcessManager* pmanager = particle->GetProcessManager();
G4String particleName = particle->GetParticleName();
if (particleName == "gamma") {
// gamma
pmanager->AddDiscreteProcess(new G4PhotoElectricEffect);
pmanager->AddDiscreteProcess(new G4ComptonScattering);
pmanager->AddDiscreteProcess(new G4GammaConversion);
} else if (particleName == "e-") {
//electron
pmanager->AddProcess(new G4eMultipleScattering, -1, 1, 1);
pmanager->AddProcess(new G4eIonisation,
-1, 2, 2);
pmanager->AddProcess(new G4eBremsstrahlung,
-1, 3, 3);
} else if (particleName == "e+") {
//positron
pmanager->AddProcess(new G4eMultipleScattering, -1, 1, 1);
pmanager->AddProcess(new G4eIonisation,
-1, 2, 2);
pmanager->AddProcess(new G4eBremsstrahlung,
-1, 3, 3);
pmanager->AddProcess(new G4eplusAnnihilation, 0,-1, 4);
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPhysicsList - demo
} else if( particleName == "mu+" || particleName == "mu-" ) {
pmanager->AddProcess(new G4hMultipleScattering, -1, 1, 1);
pmanager->AddProcess(new G4MuIonisation,
-1, 2, 2);
pmanager->AddProcess(new G4MuBremsstrahlung, -1, 3, 3);
pmanager->AddProcess(new G4MuPairProduction, -1, 4, 4);
//muon
ExPhysicsList - demo
#include "G4Decay.hh"
void ExN02PhysicsList::ConstructGeneral()
{
// Add Decay Process
G4Decay* theDecayProcess = new G4Decay();
theParticleIterator->reset();
while( (*theParticleIterator)() ){
G4ParticleDefinition* particle = theParticleIterator>value();
G4ProcessManager* pmanager = particle>GetProcessManager();
if (theDecayProcess->IsApplicable(*particle)) {
pmanager ->AddProcess(theDecayProcess);
// set ordering for PostStepDoIt and AtRestDoIt
pmanager ->SetProcessOrdering(theDecayProcess,
idxPostStep);
pmanager ->SetProcessOrdering(theDecayProcess,
idxAtRest);
}
}
}
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPhysicsList - demo
#include "G4StepLimiter.hh"
#include "G4UserSpecialCuts.hh"
void ExPhysicsList::AddStepMax()
{
// Step limitation seen as a process
G4StepLimiter* stepLimiter = new G4StepLimiter();
////G4UserSpecialCuts* userCuts = new G4UserSpecialCuts();
theParticleIterator->reset();
while ((*theParticleIterator)())
{
G4ParticleDefinition* particle = theParticleIterator>value();
G4ProcessManager* pmanager = particle>GetProcessManager();
if (particle->GetPDGCharge() != 0.0)
{
pmanager ->AddDiscreteProcess(stepLimiter);
////pmanager ->AddDiscreteProcess(userCuts);
}
}
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPhysicsList - demo
ExPhysicsList::ExPhysicsList(): G4VUserPhysicsList()
{ // default cut
value (1.0mm) defaultCutValue = 1.0*mm;
}
void ExPhysicsList::SetCuts()
{
// the default cut value for all particle types
SetCutsWithDefault();
// specific cut values
SetCutValue(cutForGamma, "gamma");
SetCutValue(cutForElectron, "e-");
SetCutValue(cutForElectron, "e+");
if (verboseLevel>0) DumpCutValuesTable();
}
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPhysicsList.hh
#include "G4VUserPhysicsList.hh"
#include "globals.hh"
class ExPhysicsList: public
G4VUserPhysicsList
{
public:
ExPhysicsList();
~ExPhysicsList();
protected:
// Construct particle and physics process
void ConstructParticle();
void ConstructProcess();
void SetCuts();
};
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPrimaryGeneratorAction
ExPrimaryGeneratorActio
n
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPrimaryGeneratorAction - demo
Definicin de partcula disparadas
G4int n_particle = 1;
particleGun = new G4ParticleGun(n_particle);
particleGun>SetParticleDefinition(G4Geantino::GeantinoDefinition());
particleGun->SetParticleEnergy(1.0*GeV);
particleGun->SetParticlePosition(G4ThreeVector(2.0*m,0.0*m,0.0*m));
Seteos posibles
void
SetParticleDefinition(G4ParticleDefinition*)
void
SetParticleMomentum(G4ParticleMomentum)
void
SetParticleMomentumDirection(G4ThreeVect
or)
void SetParticleEnergy(G4double)
void SetParticleTime(G4double)
void SetParticlePosition(G4ThreeVector)
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
ExPrimaryGeneratorAction.hh
#include "G4VUserPrimaryGeneratorAction.hh"
class G4ParticleGun;
class G4Event;
class ExPrimaryGeneratorAction : public
G4VUserPrimaryGeneratorAction
{
public:
ExPrimaryGeneratorAction();
~ExPrimaryGeneratorAction();
public:
void GeneratePrimaries(G4Event* anEvent);
private:
G4ParticleGun* particleGun;
};
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09
"G4Event.hh"
"G4ParticleGun.hh"
"G4ParticleTable.hh"
"G4ParticleDefinition.hh"
"globals.hh"
ExPrimaryGeneratorAction::ExPrimaryGeneratorAction()
{
G4int n_particle = 1;
particleGun = new G4ParticleGun(n_particle);
G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
G4ParticleDefinition* particle = particleTable->FindParticle("proton");
G4String particleName;
// find in particle table
particleGun->SetParticleDefinition(particleTable>FindParticle(particleName="geantino"));
// use defined particle
particleGun->SetParticleDefinition(particle);
particleGun->SetParticleEnergy(1.0*GeV);
particleGun->SetParticlePosition(G4ThreeVector(-2.0*m,
0.0, 0.0));
www.gphysics.net UFRO-Master-Fisica-Medica-5-3-Geant4-05.09