Skip to content
Snippets Groups Projects

SiEIC Concept: DDG4 simulation steering without lcgeo

Merged David Blyth requested to merge sieic_update into master
8 files
+ 1837
1410
Compare changes
  • Side-by-side
  • Inline
Files
8
+ 163
0
#!/usr/bin/env python2
import argparse
import datetime
import os
import struct
from SystemOfUnits import *
def run(compact_path, n_events, input_file, output_file):
import DDG4
kernel = DDG4.Kernel()
kernel.NumEvents = n_events
# Random
rand_action = DDG4.Action(kernel, 'Geant4Random/R1')
seed = struct.unpack('Q', os.urandom(8))[0]
print('Random seed: ' + str(seed))
rand_action.Seed = seed
rand_action.Luxury = 1
rand_action.initialize()
rand_action.showStatus()
# Geometry
kernel.loadGeometry('file:' + compact_path)
dd = kernel.detectorDescription()
DDG4.importConstants(dd)
# Physics
phys_list = kernel.physicsList()
phys_list.extends = 'FTFP_BERT'
phys_list.decays = True
phys_list.rangecut = 0.1 * mm
phys_list.dump()
# Field config
mag_field_track = DDG4.PhaseAction(kernel, 'Geant4FieldTrackingSetupAction/MagFieldTrackingSetup')
mag_field_track.stepper = 'ClassicalRK4'
mag_field_track.equation = 'Mag_UsualEqRhs'
mag_field_track.min_chord_step = 0.01 * mm
mag_field_track.eps_min = -1
mag_field_track.eps_max = -1
mag_field_track.delta_chord = -1
mag_field_track.delta_intersection = -1
mag_field_track.delta_one_step = -1
mag_field_track.largest_step = -1
kernel.phase('configure').add(mag_field_track)
# Sensitive detectors
for map_entry in dd.detectors():
det = DDG4.DetElement(map_entry.second.ptr())
name = det.name()
sd = dd.sensitiveDetector(name)
if sd.isValid():
type = sd.type()
seq = DDG4.SensitiveSequence(kernel, 'Geant4SensDetActionSequence/' + name)
if type == 'tracker':
action = DDG4.SensitiveAction(kernel, 'Geant4TrackerAction/' + name + 'Handler', name)
elif type == 'calorimeter':
action = DDG4.SensitiveAction(kernel, 'Geant4CalorimeterAction/' + name + 'Handler', name)
seq.add(action)
# Output
run_header = {}
with open(os.path.realpath(__file__), 'r') as run_script:
run_header['RunScript'] = run_script.read()
run_header['DateUTC'] = str(datetime.datetime.utcnow()) + ' UTC'
output_action = DDG4.EventAction(kernel, 'Geant4Output2LCIO/LCIOOutput', True)
output_action.Control = True
output_action.Output = output_file
output_action.RunHeader = run_header
kernel.eventAction().add(output_action)
# Generator
gen_action = kernel.generatorAction()
gen_init = DDG4.GeneratorAction(kernel, 'Geant4GeneratorActionInit/GenerationInit')
gen_action.adopt(gen_init)
if input_file == None:
gun = DDG4.GeneratorAction(kernel, 'Geant4ParticleGun/Gun')
gun.Standalone = False
gun.energy = 10 * GeV
gun.particle = 'mu-'
gun.isotrop = True
gun.Distribution = 'eta'
gen_action.adopt(gun)
else:
params = {}
params['MCParticleCollectionName'] = 'MCParticle'
mc = DDG4.GeneratorAction(kernel, 'LCIOInputAction/LCIOInput')
mc.Parameters = params
mc.Input = 'LCIOFileReader|' + input_file
gen_action.adopt(mc)
vertex_boost = DDG4.GeneratorAction(kernel, 'Geant4InteractionVertexBoost')
vertex_boost.Angle = 0 #0.007
gen_action.adopt(vertex_boost)
int_merger = DDG4.GeneratorAction(kernel, 'Geant4InteractionMerger/InteractionMerger')
gen_action.adopt(int_merger)
primary_handler = DDG4.GeneratorAction(kernel, 'Geant4PrimaryHandler/PrimaryHandler')
gen_action.adopt(primary_handler)
particle_handler = DDG4.GeneratorAction(kernel, 'Geant4ParticleHandler/ParticleHandler')
particle_handler.SaveProcesses = ['Decay']
particle_handler.MinimalKineticEnergy = 1 * MeV
particle_handler.KeepAllParticles = False
particle_handler.PrintStartTracking = False
particle_handler.PrintEndTracking = False
particle_handler.MinDistToParentVertex = 2.2e-14 * mm
user_handler = DDG4.Action(kernel, 'Geant4TCUserParticleHandler/UserParticleHandler')
user_handler.TrackingVolume_Zmax = DDG4.tracking_region_zmax
user_handler.TrackingVolume_Rmax = DDG4.tracking_region_radius
particle_handler.adopt(user_handler)
gen_action.adopt(particle_handler)
# Detailed info
particle_dump = DDG4.EventAction(kernel, 'Geant4ParticleDumpAction')
kernel.eventAction().adopt(particle_dump)
# Execute
kernel.configure()
kernel.initialize()
kernel.run()
kernel.terminate()
def define_args(parser):
parser.add_argument(
'compact_path',
help='file with compact XML detector description'
)
parser.add_argument(
'n_events',
type=int,
help='number of events to simulate'
)
parser.add_argument(
'-i', '--input',
dest='input_file',
default=None,
help='truth-level input path'
)
parser.add_argument(
'-o', '--output',
dest='output_file',
default='test_output.slcio',
help='output path'
)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='sieic_sim')
define_args(parser)
args = parser.parse_args()
run(
args.compact_path,
args.n_events,
args.input_file,
args.output_file
)
Loading