Newer
Older
Markus Frank
committed
import os, time, logging, DDG4
Markus Frank
committed
logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG)
Markus Frank
committed
logging.info("""
Markus Frank
committed
in multi-threaded mode using the python configuration
Markus Frank
committed
""")
Markus Frank
committed
def setupWorker(geant4):
kernel = geant4.kernel()
Markus Frank
committed
logging.info('#PYTHON: +++ Creating Geant4 worker thread ....')
logging.info("#PYTHON: Configure Run actions")
Markus Frank
committed
run1 = DDG4.RunAction(kernel,'Geant4TestRunAction/RunInit',shared=True)
run1.Property_int = int(12345)
run1.Property_double = -5e15*keV
run1.Property_string = 'Startrun: Hello_2'
logging.info("%s %s %s",run1.Property_string, str(run1.Property_double), str(run1.Property_int))
Markus Frank
committed
logging.info("#PYTHON: Configure Event actions")
prt = DDG4.EventAction(kernel,'Geant4ParticlePrint/ParticlePrint')
prt.OutputLevel = Output.INFO
prt.OutputType = 3 # Print both: table and tree
Markus Frank
committed
logging.info("\n#PYTHON: Configure I/O\n")
#evt_lcio = geant4.setupLCIOOutput('LcioOutput','CLICSiD_'+time.strftime('%Y-%m-%d_%H-%M'))
#evt_lcio.OutputLevel = Output.ERROR
evt_root = geant4.setupROOTOutput('RootOutput','CLICSiD_'+time.strftime('%Y-%m-%d_%H-%M'))
gen = DDG4.GeneratorAction(kernel,"Geant4GeneratorActionInit/GenerationInit")
#VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
Markus Frank
committed
logging.info("#PYTHON:\n#PYTHON: Generation of isotrope tracks of a given multiplicity with overlay:\n#PYTHON:")
logging.info("#PYTHON: First particle generator: pi+")
gen = DDG4.GeneratorAction(kernel,"Geant4IsotropeGenerator/IsotropPi+");
Markus Frank
committed
gen.Mask = 1
Markus Frank
committed
gen.Energy = 20 * GeV
kernel.generatorAction().adopt(gen)
Markus Frank
committed
logging.info("#PYTHON: Install vertex smearing for this interaction")
gen = DDG4.GeneratorAction(kernel,"Geant4InteractionVertexSmear/SmearPi+");
Markus Frank
committed
gen.Mask = 1
gen.Offset = (20*mm, 10*mm, 10*mm, 0*ns)
Markus Frank
committed
gen.Sigma = (4*mm, 1*mm, 1*mm, 0*ns)
kernel.generatorAction().adopt(gen)
Markus Frank
committed
logging.info("#PYTHON: Second particle generator: e-")
gen = DDG4.GeneratorAction(kernel,"Geant4IsotropeGenerator/IsotropE-");
Markus Frank
committed
gen.Mask = 2
Markus Frank
committed
gen.Energy = 15 * GeV
kernel.generatorAction().adopt(gen)
Markus Frank
committed
logging.info("#PYTHON: Install vertex smearing for this interaction")
gen = DDG4.GeneratorAction(kernel,"Geant4InteractionVertexSmear/SmearE-");
Markus Frank
committed
gen.Mask = 2
gen.Offset = (-20*mm, -10*mm, -10*mm, 0*ns)
Markus Frank
committed
gen.Sigma = (12*mm, 8*mm, 8*mm, 0*ns)
kernel.generatorAction().adopt(gen)
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Markus Frank
committed
logging.info("#PYTHON: Merge all existing interaction records")
gen = DDG4.GeneratorAction(kernel,"Geant4InteractionMerger/InteractionMerger")
gen.OutputLevel = 4 #generator_output_level
kernel.generatorAction().adopt(gen)
Markus Frank
committed
logging.info("#PYTHON: Finally generate Geant4 primaries")
gen = DDG4.GeneratorAction(kernel,"Geant4PrimaryHandler/PrimaryHandler")
gen.OutputLevel = 4 #generator_output_level
kernel.generatorAction().adopt(gen)
Markus Frank
committed
logging.info("#PYTHON: ....and handle the simulation particles.")
part = DDG4.GeneratorAction(kernel,"Geant4ParticleHandler/ParticleHandler")
kernel.generatorAction().adopt(part)
#part.SaveProcesses = ['conv','Decay']
part.SaveProcesses = ['Decay']
part.MinimalKineticEnergy = 100*MeV
part.OutputLevel = 5 # generator_output_level
part.enableUI()
user = DDG4.Action(kernel,"Geant4TCUserParticleHandler/UserParticleHandler")
user.TrackingVolume_Zmax = DDG4.EcalEndcap_zmin
user.TrackingVolume_Rmax = DDG4.EcalBarrel_rmin
user.enableUI()
part.adopt(user)
Markus Frank
committed
logging.info('#PYTHON: +++ Geant4 worker thread configured successfully....')
Markus Frank
committed
return 1
def setupMaster(geant4):
kernel = geant4.master()
logging.info('#PYTHON: +++ Setting up master thread for %d workers',int(kernel.NumberOfThreads))
Markus Frank
committed
return 1
def setupSensitives(geant4):
Markus Frank
committed
logging.info("#PYTHON: Setting up all sensitive detectors")
Markus Frank
committed
geant4.printDetectors()
Markus Frank
committed
logging.info("#PYTHON: First the tracking detectors")
seq,act = geant4.setupTracker('SiVertexBarrel')
seq,act = geant4.setupTracker('SiVertexEndcap')
seq,act = geant4.setupTracker('SiTrackerBarrel')
seq,act = geant4.setupTracker('SiTrackerEndcap')
seq,act = geant4.setupTracker('SiTrackerForward')
Markus Frank
committed
logging.info("#PYTHON: Now setup the calorimeters")
seq,act = geant4.setupCalorimeter('EcalBarrel')
seq,act = geant4.setupCalorimeter('EcalEndcap')
seq,act = geant4.setupCalorimeter('HcalBarrel')
seq,act = geant4.setupCalorimeter('HcalEndcap')
seq,act = geant4.setupCalorimeter('HcalPlug')
seq,act = geant4.setupCalorimeter('MuonBarrel')
seq,act = geant4.setupCalorimeter('MuonEndcap')
seq,act = geant4.setupCalorimeter('LumiCal')
seq,act = geant4.setupCalorimeter('BeamCal')
Markus Frank
committed
return 1
Markus Frank
committed
def run():
kernel = DDG4.Kernel()
Markus Frank
committed
install_dir = os.environ['DD4hepINSTALL']
DDG4.Core.setPrintFormat("%-32s %6s %s")
kernel.loadGeometry("file:"+install_dir+"/DDDetectors/compact/SiD.xml")
Markus Frank
committed
kernel.NumberOfThreads = 3
kernel.RunManagerType = 'G4MTRunManager'
Markus Frank
committed
geant4 = DDG4.Geant4(kernel,tracker='Geant4TrackerCombineAction')
Markus Frank
committed
logging.info("# Configure UI")
Markus Frank
committed
geant4.setupCshUI()
Markus Frank
committed
logging.info("# Geant4 user initialization action")
Markus Frank
committed
geant4.addUserInitialization(worker=setupWorker, worker_args=(geant4,),
master=setupMaster, master_args=(geant4,))
Markus Frank
committed
Markus Frank
committed
logging.info("# Configure G4 geometry setup")
Markus Frank
committed
seq,act = geant4.addDetectorConstruction("Geant4DetectorGeometryConstruction/ConstructGeo")
Markus Frank
committed
logging.info("# Configure G4 sensitive detectors: python setup callback")
Markus Frank
committed
seq,act = geant4.addDetectorConstruction("Geant4PythonDetectorConstruction/SetupSD",
sensitives=setupSensitives,sensitives_args=(geant4,))
Markus Frank
committed
logging.info("# Configure G4 sensitive detectors: atach'em to the sensitive volumes")
Markus Frank
committed
seq,act = geant4.addDetectorConstruction("Geant4DetectorSensitivesConstruction/ConstructSD")
# allow_threads=True)
Markus Frank
committed
logging.info("# Configure G4 magnetic field tracking")
geant4.setupTrackingFieldMT()
logging.info("# Setup random generator")
Markus Frank
committed
rndm = DDG4.Action(kernel,'Geant4Random/Random')
rndm.Seed = 987654321
rndm.initialize()
##rndm.showStatus()
Markus Frank
committed
logging.info("# Now build the physics list:")
Markus Frank
committed
phys = geant4.setupPhysics('QGSP_BERT')
phys.dump()
Markus Frank
committed
geant4.run()
if __name__ == "__main__":
run()