Beispiel #1
0
def run():
    import sys
    import CLICSid
    import DDG4
    from DDG4 import OutputLevel as Output

    sid = CLICSid.CLICSid()
    geant4 = sid.geant4
    kernel = sid.kernel
    sid.loadGeometry(str('CLICSiD_geometry.root'))
    geant4.printDetectors()

    if len(sys.argv) >= 2 and sys.argv[1] == "batch":
        kernel.UI = ''

    geant4.setupCshUI()
    sid.setupField(quiet=False)
    DDG4.importConstants(kernel.detectorDescription(), debug=False)

    prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
    prt.OutputLevel = Output.INFO
    prt.OutputType = 3  # Print both: table and tree
    kernel.eventAction().adopt(prt)

    gen = DDG4.GeneratorAction(kernel,
                               "Geant4GeneratorActionInit/GenerationInit")
    kernel.generatorAction().adopt(gen)
    logger.info("#  First particle generator: gun")
    gun = DDG4.GeneratorAction(kernel, "Geant4GeneratorWrapper/Gun")
    gun.Uses = 'G4ParticleGun'
    gun.Mask = 1
    kernel.generatorAction().adopt(gun)

    # Merge all existing interaction records
    merger = DDG4.GeneratorAction(kernel,
                                  "Geant4InteractionMerger/InteractionMerger")
    merger.enableUI()
    kernel.generatorAction().adopt(merger)

    # And handle the simulation particles.
    part = DDG4.GeneratorAction(kernel,
                                "Geant4ParticleHandler/ParticleHandler")
    kernel.generatorAction().adopt(part)
    part.OutputLevel = Output.INFO
    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)

    sid.setupDetectors()
    sid.setupPhysics('QGSP_BERT')
    sid.test_config()
    gun.generator(
    )  # Instantiate gun to be able to set properties from G4 prompt
    kernel.run()
    kernel.terminate()
Beispiel #2
0
def run():
    kernel = DDG4.Kernel()
    description = kernel.detectorDescription()

    install_dir = os.environ['DD4hepExamplesINSTALL']
    kernel.loadGeometry(
        str("file:" + install_dir +
            "/examples/ClientTests/compact/LheD_tracker.xml"))

    DDG4.importConstants(description, debug=False)
    geant4 = DDG4.Geant4(kernel, tracker='Geant4TrackerCombineAction')
    geant4.printDetectors()

    # Configure UI
    geant4.setupCshUI()
    # geant4.setupCshUI('csh',True,True)
    # geant4.setupCshUI('csh',True,True,'vis.mac')
    if len(sys.argv) >= 2 and sys.argv[1] == "batch":
        kernel.UI = ''

    # Configure field
    geant4.setupTrackingField(prt=True)
    # Configure Event actions
    prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
    prt.OutputLevel = Output.WARNING  # Output.WARNING
    prt.OutputType = 3  # Print both: table and tree
    kernel.eventAction().adopt(prt)

    # Configure I/O
    geant4.setupROOTOutput('RootOutput',
                           'LHeD_tracker_' + time.strftime('%Y-%m-%d_%H-%M'))
    gen = geant4.setupGun("Gun",
                          particle='geantino',
                          energy=20 * GeV,
                          position=(0 * mm, 0 * mm, 0 * cm),
                          multiplicity=3)
    gen.isotrop = False
    gen.direction = (1, 0, 0)
    gen.OutputLevel = Output.WARNING

    # seq,act = geant4.setupTracker('SiVertexBarrel')

    # Now build the physics list:
    phys = geant4.setupPhysics('QGSP_BERT')
    ph = DDG4.PhysicsList(kernel, 'Geant4PhysicsList/Myphysics')
    ph.addParticleConstructor(str('G4Geantino'))
    ph.addParticleConstructor(str('G4BosonConstructor'))
    ph.enableUI()
    phys.adopt(ph)
    phys.dump()

    kernel.configure()
    kernel.initialize()

    # DDG4.setPrintLevel(Output.DEBUG)
    kernel.run()
    logger.info('End of run. Terminating .......')
    kernel.terminate()
Beispiel #3
0
def run():
    kernel = DDG4.Kernel()
    install_dir = os.environ['DD4hepINSTALL']
    kernel.setOutputLevel('Geant4Converter', Output.DEBUG)
    kernel.setOutputLevel('Gun', Output.INFO)
    kernel.loadGeometry("file:" + install_dir +
                        "/examples/ClientTests/compact/MiniTel.xml")

    geant4 = DDG4.Geant4(kernel)
    geant4.printDetectors()
    geant4.setupCshUI()
    if len(sys.argv) >= 2 and sys.argv[1] == "batch":
        kernel.NumEvents = 200
        kernel.UI = ''

    # Configure field
    field = geant4.setupTrackingField(prt=True)
    # Setup particle gun
    geant4.setupGun("Gun", particle='pi-', energy=100 * GeV, multiplicity=1)
    # Now the calorimeters
    seq, act = geant4.setupTracker('MyLHCBdetector1')
    seq, act = geant4.setupTracker('MyLHCBdetector2')
    seq, act = geant4.setupTracker('MyLHCBdetector3')
    seq, act = geant4.setupTracker('MyLHCBdetector4')
    act.OutputLevel = 4
    seq, act = geant4.setupTracker('MyLHCBdetector5')
    seq, act = geant4.setupTracker('MyLHCBdetector6')
    seq, act = geant4.setupTracker('MyLHCBdetector7')
    seq, act = geant4.setupTracker('MyLHCBdetector8')
    seq, act = geant4.setupTracker('MyLHCBdetector9')
    seq, act = geant4.setupTracker('MyLHCBdetector10')

    # And handle the simulation particles.
    part = DDG4.GeneratorAction(kernel,
                                "Geant4ParticleHandler/ParticleHandler")
    kernel.generatorAction().adopt(part)
    part.SaveProcesses = ['conv', 'Decay']
    part.MinimalKineticEnergy = 1 * MeV
    part.OutputLevel = 5  # generator_output_level
    part.enableUI()

    hit_tuple = DDG4.EventAction(kernel, 'HitTupleAction/MiniTelTuple', True)
    hit_tuple.OutputFile = 'MiniTel_EnergyDeposits_' + time.strftime(
        '%Y-%m-%d_%H-%M') + '.root'
    hit_tuple.Collections = ['*']
    kernel.eventAction().add(hit_tuple)

    # Now build the physics list:
    phys = kernel.physicsList()
    phys.extends = 'QGSP_BERT'
    phys.enableUI()
    # and run
    geant4.execute()
Beispiel #4
0
def run():
  import logging, LHeD, DDG4
  from DDG4 import OutputLevel as Output
  
  logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG)
  lhed = LHeD.LHeD()
  geant4 = lhed.geant4
  kernel = lhed.kernel
  lhed.loadGeometry()
  geant4.printDetectors()
  kernel.UI = "UI"
  geant4.setupCshUI()
  lhed.setupField(quiet=False)
  DDG4.importConstants(kernel.detectorDescription(),debug=False)

  prt = DDG4.EventAction(kernel,'Geant4ParticlePrint/ParticlePrint')
  prt.OutputLevel = Output.INFO
  prt.OutputType  = 3 # Print both: table and tree
  kernel.eventAction().adopt(prt)

  gen = DDG4.GeneratorAction(kernel,"Geant4GeneratorActionInit/GenerationInit")
  kernel.generatorAction().adopt(gen)
  logging.info("#  First particle generator: gun")
  gun = DDG4.GeneratorAction(kernel,"Geant4GeneratorWrapper/Gun");
  gun.Uses     = 'G4ParticleGun'
  gun.Mask     = 1
  kernel.generatorAction().adopt(gun)

  # Merge all existing interaction records
  merger = DDG4.GeneratorAction(kernel,"Geant4InteractionMerger/InteractionMerger")
  merger.enableUI()
  kernel.generatorAction().adopt(merger)


  # And handle the simulation particles.
  part = DDG4.GeneratorAction(kernel,"Geant4ParticleHandler/ParticleHandler")
  kernel.generatorAction().adopt(part)
  part.OutputLevel = Output.INFO
  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)

  lhed.setupDetectors()
  lhed.setupPhysics('QGSP_BERT')
  lhed.test_config()
  gun.generator()  # Instantiate gun to be able to set properties from G4 prompt
  kernel.run()
  kernel.terminate()
Beispiel #5
0
def run():
    kernel = DDG4.Kernel()
    install_dir = os.environ['DD4hepExamplesINSTALL']
    kernel.loadGeometry("file:" + install_dir +
                        "/examples/ClientTests/compact/SiliconBlock.xml")
    DDG4.importConstants(kernel.detectorDescription(), debug=False)
    # =======================================================================================
    # ===> This is actually the ONLY difference to ClientTests/scripts/SiliconBlock.py
    # =======================================================================================
    geant4 = DDG4.Geant4(kernel, tracker='MyTrackerSDAction')

    geant4.printDetectors()
    kernel.NumEvents = 5
    kernel.UI = ''

    # Configure field
    field = geant4.setupTrackingField(prt=True)
    # Configure Event actions
    prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
    prt.OutputLevel = Output.WARNING
    prt.OutputType = 3  # Print both: table and tree
    kernel.eventAction().adopt(prt)

    # Configure I/O
    evt_root = geant4.setupROOTOutput('RootOutput',
                                      'MySD_' +
                                      time.strftime('%Y-%m-%d_%H-%M'),
                                      mc_truth=False)
    # Setup particle gun
    gun = geant4.setupGun("Gun",
                          particle='mu-',
                          energy=5 * GeV,
                          multiplicity=1,
                          Standalone=True,
                          position=(0, 0, 0))
    seq, act = geant4.setupTracker('SiliconBlockUpper')
    act.OutputLevel = Output.INFO
    seq, act = geant4.setupTracker('SiliconBlockDown')
    act.OutputLevel = Output.INFO
    # Now build the physics list:
    phys = kernel.physicsList()
    phys.extends = 'QGSP_BERT'
    phys.enableUI()
    phys.dump()
    # run
    kernel.configure()
    kernel.initialize()
    kernel.run()
    kernel.terminate()
Beispiel #6
0
def run():
    m = MiniTelSetup.Setup()
    if len(sys.argv) >= 2 and sys.argv[1] == "batch":
        m.kernel.NumEvents = 200
        m.kernel.UI = ''
    m.configure()
    m.setupGun()
    m.setupGenerator()
    # This is the actual test:
    hit_tuple = DDG4.EventAction(m.kernel, 'HitTupleAction/MiniTelTuple', True)
    hit_tuple.OutputFile = 'MiniTel_EnergyDeposits_' + time.strftime(
        '%Y-%m-%d_%H-%M') + '.root'
    hit_tuple.Collections = ['*']
    m.kernel.eventAction().add(hit_tuple)
    # Setup physics
    m.setupPhysics()
    # ... and run
    m.geant4.execute()
Beispiel #7
0
def run():
    kernel = DDG4.Kernel()
    install_dir = os.environ['DD4hepExamplesINSTALL']
    kernel.loadGeometry(
        str("file:" + install_dir +
            "/examples/OpticalSurfaces/compact/OpNovice.xml"))

    DDG4.importConstants(kernel.detectorDescription(), debug=False)
    geant4 = DDG4.Geant4(kernel, tracker='Geant4TrackerCombineAction')
    geant4.printDetectors()
    # Configure UI
    if len(sys.argv) > 1:
        geant4.setupCshUI(macro=sys.argv[1])
    else:
        geant4.setupCshUI()

    # Configure field
    geant4.setupTrackingField(prt=True)
    # Configure Event actions
    prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
    prt.OutputLevel = Output.DEBUG
    prt.OutputType = 3  # Print both: table and tree
    kernel.eventAction().adopt(prt)

    generator_output_level = Output.INFO

    # Configure G4 geometry setup
    seq, act = geant4.addDetectorConstruction(
        "Geant4DetectorGeometryConstruction/ConstructGeo")
    act.DebugMaterials = True
    act.DebugElements = False
    act.DebugVolumes = True
    act.DebugShapes = True
    act.DebugSurfaces = True

    # Configure I/O
    # evt_root = geant4.setupROOTOutput('RootOutput','OpNovice_'+time.strftime('%Y-%m-%d_%H-%M'))

    # Setup particle gun
    gun = geant4.setupGun("Gun",
                          particle='gamma',
                          energy=5 * keV,
                          multiplicity=1)
    gun.OutputLevel = generator_output_level

    # And handle the simulation particles.
    """
  part = DDG4.GeneratorAction(kernel,"Geant4ParticleHandler/ParticleHandler")
  kernel.generatorAction().adopt(part)
  part.SaveProcesses = ['Decay']
  part.MinimalKineticEnergy = 100*MeV
  part.OutputLevel = Output.INFO #generator_output_level
  part.enableUI()
  user = DDG4.Action(kernel,"Geant4TCUserParticleHandler/UserParticleHandler")
  user.TrackingVolume_Zmax = 3.0*m
  user.TrackingVolume_Rmax = 3.0*m
  user.enableUI()
  part.adopt(user)
  """
    geant4.setupTracker('BubbleDevice')

    # Now build the physics list:
    phys = geant4.setupPhysics('')
    ph = DDG4.PhysicsList(kernel,
                          'Geant4OpticalPhotonPhysics/OpticalGammaPhys')
    ph.VerboseLevel = 2
    ph.addParticleGroup('G4BosonConstructor')
    ph.addParticleGroup('G4LeptonConstructor')
    ph.addParticleGroup('G4MesonConstructor')
    ph.addParticleGroup('G4BaryonConstructor')
    ph.addParticleGroup('G4IonConstructor')
    ph.addParticleConstructor('G4OpticalPhoton')

    ph.addDiscreteParticleProcess('gamma', 'G4GammaConversion')
    ph.addDiscreteParticleProcess('gamma', 'G4ComptonScattering')
    ph.addDiscreteParticleProcess('gamma', 'G4PhotoElectricEffect')
    ph.addParticleProcess(str('e[+-]'), str('G4eMultipleScattering'), -1, 1, 1)
    ph.addParticleProcess(str('e[+-]'), str('G4eIonisation'), -1, 2, 2)
    ph.addParticleProcess(str('e[+-]'), str('G4eBremsstrahlung'), -1, 3, 3)
    ph.addParticleProcess(str('e+'), str('G4eplusAnnihilation'), 0, -1, 4)
    ph.addParticleProcess(str('mu[+-]'), str('G4MuMultipleScattering'), -1, 1,
                          1)
    ph.addParticleProcess(str('mu[+-]'), str('G4MuIonisation'), -1, 2, 2)
    ph.addParticleProcess(str('mu[+-]'), str('G4MuBremsstrahlung'), -1, 3, 3)
    ph.addParticleProcess(str('mu[+-]'), str('G4MuPairProduction'), -1, 4, 4)
    ph.enableUI()
    phys.adopt(ph)

    ph = DDG4.PhysicsList(kernel,
                          'Geant4ScintillationPhysics/ScintillatorPhys')
    ph.ScintillationYieldFactor = 1.0
    ph.ScintillationExcitationRatio = 1.0
    ph.TrackSecondariesFirst = False
    ph.VerboseLevel = 2
    ph.enableUI()
    phys.adopt(ph)

    ph = DDG4.PhysicsList(kernel, 'Geant4CerenkovPhysics/CerenkovPhys')
    ph.MaxNumPhotonsPerStep = 10
    ph.MaxBetaChangePerStep = 10.0
    ph.TrackSecondariesFirst = True
    ph.VerboseLevel = 2
    ph.enableUI()
    phys.adopt(ph)

    phys.dump()

    geant4.execute()
Beispiel #8
0
def run():
  kernel = DDG4.Kernel()
  install_dir = os.environ['DD4hepINSTALL']
  example_dir = install_dir+'/examples/DDG4/examples';
  kernel.loadGeometry("file:"+install_dir+"/examples/CLICSiD/compact/compact.xml")
  kernel.loadXML("file:"+example_dir+"/DDG4_field.xml")

  simple = DDG4.Simple(kernel,tracker='LcioTestTrackerAction')
  simple.printDetectors()
  # Configure UI
  simple.setupCshUI()

  # Configure Run actions
  run1 = DDG4.RunAction(kernel,'Geant4TestRunAction/RunInit')
  run1.Property_int    = 12345
  run1.Property_double = -5e15*keV
  run1.Property_string = 'Startrun: Hello_2'
  print run1.Property_string, run1.Property_double, run1.Property_int
  run1.enableUI()
  kernel.registerGlobalAction(run1)
  kernel.runAction().add(run1)

  # Configure Event actions
  evt2 = DDG4.EventAction(kernel,'Geant4TestEventAction/UserEvent_2')
  evt2.Property_int    = 123454321
  evt2.Property_double = 5e15*GeV
  evt2.Property_string = 'Hello_2 from the python setup'
  evt2.enableUI()
  kernel.registerGlobalAction(evt2)

  evt1 = DDG4.EventAction(kernel,'Geant4TestEventAction/UserEvent_1')
  evt1.Property_int=01234
  evt1.Property_double=1e11
  evt1.Property_string='Hello_1'
  evt1.enableUI()

  kernel.eventAction().add(evt1)
  kernel.eventAction().add(evt2)
  """
  trk = DDG4.Action(kernel,"Geant4TrackPersistency/MonteCarloTruthHandler")
  kernel.registerGlobalAction(trk)
  trk.release()
  mc  = DDG4.Action(kernel,"Geant4MonteCarloRecordManager/MonteCarloRecordManager")
  kernel.registerGlobalAction(mc)
  mc.release()
  """
  # Configure I/O
  evt_lcio = simple.setupLCIOOutput('LcioOutput','CLICSiD_'+time.strftime('%Y-%m-%d_%H-%M'))

  gen = DDG4.GeneratorAction(kernel,"Geant4TestGeneratorAction/Generate")
  kernel.generatorAction().add(gen)

  # Setup particle gun
  gun = simple.setupGun('Gun','pi-',100*GeV,True)

  """
  rdr = DDG4.GeneratorAction(kernel,"LcioGeneratorAction/Reader")
  rdr.zSpread = 0.0
  rdr.lorentzAngle = 0.0
  rdr.OutputLevel = DDG4.OutputLevel.INFO
  rdr.Input = "LcioEventReader|test.data"
  rdr.enableUI()
  kernel.generatorAction().add(rdr)
  """

  # Setup global filters fur use in sensintive detectors
  f1 = DDG4.Filter(kernel,'GeantinoRejectFilter/GeantinoRejector')
  kernel.registerGlobalFilter(f1)

  f2 = DDG4.Filter(kernel,'ParticleRejectFilter/OpticalPhotonRejector')
  f2.particle = 'opticalphoton'
  kernel.registerGlobalFilter(f2)

  f3 = DDG4.Filter(kernel,'ParticleSelectFilter/OpticalPhotonSelector') 
  f3.particle = 'opticalphoton'
  kernel.registerGlobalFilter(f3)

  f4 = DDG4.Filter(kernel,'EnergyDepositMinimumCut')
  f4.Cut = 10*MeV
  f4.enableUI()
  kernel.registerGlobalFilter(f4)

  # First the tracking detectors
  seq,act = simple.setupTracker('SiVertexBarrel')
  seq.add(f1)
  #seq.add(f4)
  act.add(f1)

  seq,act = simple.setupTracker('SiVertexEndcap')
  seq.add(f1)
  #seq.add(f4)

  seq,act = simple.setupTracker('SiTrackerBarrel')
  seq,act = simple.setupTracker('SiTrackerEndcap')
  seq,act = simple.setupTracker('SiTrackerForward')
  # Now the calorimeters
  seq,act = simple.setupCalorimeter('EcalBarrel')
  seq,act = simple.setupCalorimeter('EcalEndcap')
  seq,act = simple.setupCalorimeter('HcalBarrel')
  seq,act = simple.setupCalorimeter('HcalEndcap')
  seq,act = simple.setupCalorimeter('HcalPlug')
  seq,act = simple.setupCalorimeter('MuonBarrel')
  seq,act = simple.setupCalorimeter('MuonEndcap')
  seq,act = simple.setupCalorimeter('LumiCal')
  seq,act = simple.setupCalorimeter('BeamCal')

  # Now build the physics list:
  phys = simple.setupPhysics('QGSP_BERT')
  ph = DDG4.PhysicsList(kernel,'Geant4PhysicsList/Myphysics')
  ph.addParticleConstructor('G4BosonConstructor')
  ph.addParticleConstructor('G4LeptonConstructor')
  ph.addParticleProcess('e[+-]','G4eMultipleScattering',-1,1,1)
  ph.addPhysicsConstructor('G4OpticalPhysics')
  ph.enableUI()
  phys.add(ph)

  phys.dump()

  kernel.configure()
  kernel.initialize()

  #DDG4.setPrintLevel(Output.DEBUG)
  kernel.run()
  kernel.terminate()
Beispiel #9
0
def run():
    kernel = DDG4.Kernel()
    description = kernel.detectorDescription()
    install_dir = os.environ['DD4hepINSTALL']
    kernel.loadGeometry("file:" + install_dir + "/DDDetectors/compact/SiD.xml")
    DDG4.importConstants(description)

    geant4 = DDG4.Geant4(kernel, tracker='Geant4TrackerCombineAction')
    geant4.printDetectors()
    logging.info("#  Configure UI")
    geant4.setupCshUI()

    logging.info("#  Configure G4 magnetic field tracking")
    geant4.setupTrackingField()

    logging.info("#  Setup random generator")
    rndm = DDG4.Action(kernel, 'Geant4Random/Random')
    rndm.Seed = 987654321
    rndm.initialize()
    ##rndm.showStatus()

    logging.info("#  Configure Run actions")
    run1 = DDG4.RunAction(kernel, 'Geant4TestRunAction/RunInit')
    run1.Property_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))
    run1.enableUI()
    kernel.registerGlobalAction(run1)
    kernel.runAction().adopt(run1)

    logging.info("#  Configure Event actions")
    prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
    prt.OutputLevel = Output.INFO
    prt.OutputType = 3  # Print both: table and tree
    kernel.eventAction().adopt(prt)

    logging.info("""
  Configure I/O
  """)
    #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'))

    generator_output_level = Output.INFO

    gen = DDG4.GeneratorAction(kernel,
                               "Geant4GeneratorActionInit/GenerationInit")
    kernel.generatorAction().adopt(gen)

    #VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
    logging.info("""
  Generation of isotrope tracks of a given multiplicity with overlay:
  """)
    logging.info("#  First particle generator: pi+")
    gen = DDG4.GeneratorAction(kernel, "Geant4IsotropeGenerator/IsotropPi+")
    gen.Mask = 1
    gen.Particle = 'pi+'
    gen.Energy = 100 * GeV
    gen.Multiplicity = 2
    gen.Distribution = 'cos(theta)'
    kernel.generatorAction().adopt(gen)
    logging.info("#  Install vertex smearing for this interaction")
    gen = DDG4.GeneratorAction(kernel, "Geant4InteractionVertexSmear/SmearPi+")
    gen.Mask = 1
    gen.Offset = (20 * mm, 10 * mm, 10 * mm, 0 * ns)
    gen.Sigma = (4 * mm, 1 * mm, 1 * mm, 0 * ns)
    kernel.generatorAction().adopt(gen)

    logging.info("#  Second particle generator: e-")
    gen = DDG4.GeneratorAction(kernel, "Geant4IsotropeGenerator/IsotropE-")
    gen.Mask = 2
    gen.Particle = 'e-'
    gen.Energy = 25 * GeV
    gen.Multiplicity = 3
    gen.Distribution = 'uniform'
    kernel.generatorAction().adopt(gen)
    logging.info("  Install vertex smearing for this interaction")
    gen = DDG4.GeneratorAction(kernel, "Geant4InteractionVertexSmear/SmearE-")
    gen.Mask = 2
    gen.Offset = (-20 * mm, -10 * mm, -10 * mm, 0 * ns)
    gen.Sigma = (12 * mm, 8 * mm, 8 * mm, 0 * ns)
    kernel.generatorAction().adopt(gen)
    #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    logging.info("#  Merge all existing interaction records")
    gen = DDG4.GeneratorAction(kernel,
                               "Geant4InteractionMerger/InteractionMerger")
    gen.OutputLevel = 4  #generator_output_level
    gen.enableUI()
    kernel.generatorAction().adopt(gen)

    logging.info("#  Finally generate Geant4 primaries")
    gen = DDG4.GeneratorAction(kernel, "Geant4PrimaryHandler/PrimaryHandler")
    gen.OutputLevel = 4  #generator_output_level
    gen.enableUI()
    kernel.generatorAction().adopt(gen)

    logging.info("#  ....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)

    logging.info("#  Setup global filters fur use in sensitive detectors")
    f1 = DDG4.Filter(kernel, 'GeantinoRejectFilter/GeantinoRejector')
    f2 = DDG4.Filter(kernel, 'ParticleRejectFilter/OpticalPhotonRejector')
    f2.particle = 'opticalphoton'
    f3 = DDG4.Filter(kernel, 'ParticleSelectFilter/OpticalPhotonSelector')
    f3.particle = 'opticalphoton'
    f4 = DDG4.Filter(kernel, 'EnergyDepositMinimumCut')
    f4.Cut = 10 * MeV
    f4.enableUI()
    kernel.registerGlobalFilter(f1)
    kernel.registerGlobalFilter(f2)
    kernel.registerGlobalFilter(f3)
    kernel.registerGlobalFilter(f4)

    logging.info("#  First the tracking detectors")
    seq, act = geant4.setupTracker('SiVertexBarrel')
    seq.adopt(f1)
    #seq.adopt(f4)
    act.adopt(f1)

    seq, act = geant4.setupTracker('SiVertexEndcap')
    seq.adopt(f1)
    #seq.adopt(f4)

    seq, act = geant4.setupTracker('SiTrackerBarrel')
    seq, act = geant4.setupTracker('SiTrackerEndcap')
    seq, act = geant4.setupTracker('SiTrackerForward')
    logging.info("#  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')

    logging.info("#  Now build the physics list:")
    phys = geant4.setupPhysics('QGSP_BERT')
    ph = geant4.addPhysics('Geant4PhysicsList/Myphysics')
    #ph.addParticleConstructor('G4BosonConstructor')
    #ph.addParticleConstructor('G4LeptonConstructor')
    #ph.addParticleProcess('e[+-]','G4eMultipleScattering',-1,1,1)
    #ph.addPhysicsConstructor('G4OpticalPhysics')

    # Add special particle types from specialized physics constructor
    part = geant4.addPhysics('Geant4ExtraParticles/ExtraParticles')
    part.pdgfile = 'checkout/DDG4/examples/particle.tbl'

    # Add global range cut
    rg = geant4.addPhysics('Geant4DefaultRangeCut/GlobalRangeCut')
    rg.RangeCut = 0.7 * mm

    phys.dump()

    kernel.configure()
    kernel.initialize()

    #DDG4.setPrintLevel(Output.DEBUG)
    kernel.run()
    kernel.terminate()
Beispiel #10
0
def run():
    geo = None
    vis = False
    dump = False
    batch = False
    install_dir = os.environ['DD4hepINSTALL']
    #
    for i in list(range(len(sys.argv))):
        c = sys.argv[i].upper()
        if c.find('BATCH') < 2 and c.find('BATCH') >= 0:
            batch = True
        elif c[:4] == '-GEO':
            geo = sys.argv[i + 1]
        elif c[:4] == '-VIS':
            vis = True
        elif c[:4] == '-DUM':
            dump = True

    if not geo:
        help()
        sys.exit(1)

    import DDG4
    kernel = DDG4.Kernel()
    description = kernel.detectorDescription()
    DDG4.setPrintLevel(DDG4.OutputLevel.INFO)
    DDG4.importConstants(description)
    #
    # Configure UI
    geant4 = DDG4.Geant4(kernel)
    ui = None
    if batch:
        geant4.setupCshUI(ui=None, vis=None)
        kernel.UI = 'UI'
    else:
        ui = geant4.setupCshUI(vis=vis)
    Output = DDG4.OutputLevel

    seq, act = geant4.addDetectorConstruction(
        "Geant4DetectorGeometryConstruction/ConstructGeo")
    act.DebugReflections = True
    act.DebugMaterials = False
    act.DebugElements = False
    act.DebugVolumes = False
    act.DebugShapes = False
    if dump:
        act.DumpHierarchy = ~0x0
    #
    kernel.setOutputLevel(str('Geant4Converter'), Output.WARNING)
    kernel.loadGeometry(geo)
    #
    geant4.printDetectors()
    # Configure field
    geant4.setupTrackingField(prt=True)
    logger.info("#  Setup random generator")
    rndm = DDG4.Action(kernel, 'Geant4Random/Random')
    rndm.Seed = 987654321
    rndm.initialize()
    #
    # Setup detector
    seq, act = geant4.setupCalorimeter('NestedBox')
    #
    # Configure I/O
    geant4.setupROOTOutput('RootOutput',
                           'Reflections_' + time.strftime('%Y-%m-%d_%H-%M'),
                           mc_truth=True)
    #
    # Setup particle gun
    geant4.setupGun(name="Gun",
                    particle='e-',
                    energy=1000 * GeV,
                    isotrop=True,
                    multiplicity=1,
                    position=(0 * m, 0 * m, 0 * m),
                    PhiMin=0.0 * rad,
                    PhiMax=math.pi * 2.0 * rad,
                    ThetaMin=0.0 * rad,
                    ThetaMax=math.pi * rad)

    logger.info("#  ....and handle the simulation particles.")
    part = DDG4.GeneratorAction(kernel,
                                str('Geant4ParticleHandler/ParticleHandler'))
    kernel.generatorAction().adopt(part)
    part.MinimalKineticEnergy = 100 * MeV
    part.SaveProcesses = ['Decay']
    part.OutputLevel = 5  # generator_output_level
    part.enableUI()
    user = DDG4.Action(kernel,
                       str('Geant4TCUserParticleHandler/UserParticleHandler'))
    user.TrackingVolume_Rmax = 3.0 * m
    user.TrackingVolume_Zmax = 2.0 * m
    user.enableUI()
    part.adopt(user)
    #
    #
    prt = DDG4.EventAction(kernel, str('Geant4ParticlePrint/ParticlePrint'))
    prt.OutputLevel = Output.INFO
    prt.OutputType = 3  # Print both: table and tree
    kernel.eventAction().adopt(prt)
    #
    # Now build the physics list:
    phys = geant4.setupPhysics(str('QGSP_BERT'))
    ph = geant4.addPhysics(str('Geant4PhysicsList/Myphysics'))
    ph.addPhysicsConstructor(str('G4StepLimiterPhysics'))
    ph.addParticleConstructor(str('G4Geantino'))
    ph.addParticleConstructor(str('G4BosonConstructor'))
    #
    # Add special particle types from specialized physics constructor
    part = geant4.addPhysics('Geant4ExtraParticles/ExtraParticles')
    part.pdgfile = os.path.join(install_dir,
                                'examples/DDG4/examples/particle.tbl')
    #
    # Add global range cut
    rg = geant4.addPhysics('Geant4DefaultRangeCut/GlobalRangeCut')
    rg.RangeCut = 0.7 * mm
    #
    phys.dump()
    #
    #
    if ui and vis:
        cmds = []
        cmds.append('/control/verbose 2')
        cmds.append('/run/initialize')
        cmds.append('/vis/open OGL')
        cmds.append('/vis/verbose errors')
        cmds.append('/vis/drawVolume')
        cmds.append('/vis/viewer/set/viewpointThetaPhi 55. 45.')
        cmds.append('/vis/scene/add/axes 0 0 0 3 m')
        ui.Commands = cmds
    kernel.NumEvents = 0
    kernel.configure()
    kernel.initialize()
    kernel.run()
    kernel.terminate()
Beispiel #11
0
def setupWorker():
  k = DDG4.Kernel()
  kernel = k.worker()
  logger.info('PYTHON: +++ Creating Geant4 worker thread ....')

  # Configure Run actions
  run1 = DDG4.RunAction(kernel, 'Geant4TestRunAction/RunInit')
  run1.Property_int = 12345
  run1.Property_double = -5e15 * keV
  run1.Property_string = 'Startrun: Hello_2'
  logger.info("%s %f %d", run1.Property_string, run1.Property_double, run1.Property_int)
  run1.enableUI()
  kernel.registerGlobalAction(run1)
  kernel.runAction().adopt(run1)

  # Configure Event actions
  prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
  prt.OutputLevel = Output.DEBUG
  prt.OutputType = 3  # Print both: table and tree
  kernel.eventAction().adopt(prt)

  # Configure Event actions
  prt = DDG4.EventAction(kernel, 'Geant4SurfaceTest/SurfaceTest')
  prt.OutputLevel = Output.INFO
  kernel.eventAction().adopt(prt)

  # Configure I/O
  evt_lcio = geant4.setupLCIOOutput('LcioOutput', 'CLICSiD_' + time.strftime('%Y-%m-%d_%H-%M'))
  evt_lcio.OutputLevel = Output.DEBUG

  # evt_root = geant4.setupROOTOutput('RootOutput','CLICSiD_'+time.strftime('%Y-%m-%d_%H-%M'))
  # generator_output_level = Output.INFO

  gen = DDG4.GeneratorAction(kernel, "Geant4GeneratorActionInit/GenerationInit")
  kernel.generatorAction().adopt(gen)

  # VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
  """
  Generation of isotrope tracks of a given multiplicity with overlay:
  """
  # First particle generator: pi+
  gen = DDG4.GeneratorAction(kernel, "Geant4IsotropeGenerator/IsotropPi+")
  gen.Particle = 'pi+'
  gen.Energy = 100 * GeV
  gen.Multiplicity = 2
  gen.Mask = 1
  gen.OutputLevel = Output.DEBUG
  gen.PhiMin = 0
  gen.PhiMax = 0
  gen.ThetaMin = 1.61
  gen.ThetaMax = 1.61

  kernel.generatorAction().adopt(gen)
  # Install vertex smearing for this interaction
  gen = DDG4.GeneratorAction(kernel, "Geant4InteractionVertexSmear/SmearPi+")
  gen.Mask = 1
  gen.Offset = (20 * mm, 10 * mm, 10 * mm, 0 * ns)
  gen.Sigma = (4 * mm, 1 * mm, 1 * mm, 0 * ns)
  kernel.generatorAction().adopt(gen)
  """
  # Second particle generator: e-
  gen = DDG4.GeneratorAction(kernel,"Geant4IsotropeGenerator/IsotropE-");
  gen.Particle = 'e-'
  gen.Energy = 25 * GeV
  gen.Multiplicity = 3
  gen.Mask = 2
  gen.OutputLevel = Output.DEBUG
  kernel.generatorAction().adopt(gen)
  # Install vertex smearing for this interaction
  gen = DDG4.GeneratorAction(kernel,"Geant4InteractionVertexSmear/SmearE-");
  gen.Mask = 2
  gen.Offset = (-20*mm, -10*mm, -10*mm, 0*ns)
  gen.Sigma = (12*mm, 8*mm, 8*mm, 0*ns)
  kernel.generatorAction().adopt(gen)
  #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  """
  # Merge all existing interaction records
  gen = DDG4.GeneratorAction(kernel, "Geant4InteractionMerger/InteractionMerger")
  gen.OutputLevel = 4  # generator_output_level
  gen.enableUI()
  kernel.generatorAction().adopt(gen)

  # Finally generate Geant4 primaries
  gen = DDG4.GeneratorAction(kernel, "Geant4PrimaryHandler/PrimaryHandler")
  gen.OutputLevel = Output.DEBUG  # generator_output_level
  gen.enableUI()
  kernel.generatorAction().adopt(gen)

  # 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 = Output.DEBUG  # 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)
  logger.info('PYTHON: +++ Geant4 worker thread configured successfully....')
  return 1
Beispiel #12
0
def setupWorker(geant4):
    kernel = geant4.kernel()
    logging.info('#PYTHON: +++ Creating Geant4 worker thread ....')
    logging.info("#PYTHON:  Configure Run actions")
    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 %f %d", run1.Property_string, run1.Property_double,
                 run1.Property_int)
    run1.enableUI()
    kernel.runAction().adopt(run1)

    logging.info("#PYTHON:  Configure Event actions")
    prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
    prt.OutputLevel = Output.INFO
    prt.OutputType = 3  # Print both: table and tree
    kernel.eventAction().adopt(prt)

    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'))

    generator_output_level = Output.INFO

    gen = DDG4.GeneratorAction(kernel,
                               "Geant4GeneratorActionInit/GenerationInit")
    kernel.generatorAction().adopt(gen)
    #VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
    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+")
    gen.Mask = 1
    gen.Particle = 'pi+'
    gen.Energy = 20 * GeV
    gen.Multiplicity = 2
    kernel.generatorAction().adopt(gen)
    logging.info("#PYTHON:  Install vertex smearing for this interaction")
    gen = DDG4.GeneratorAction(kernel, "Geant4InteractionVertexSmear/SmearPi+")
    gen.Mask = 1
    gen.Offset = (20 * mm, 10 * mm, 10 * mm, 0 * ns)
    gen.Sigma = (4 * mm, 1 * mm, 1 * mm, 0 * ns)
    kernel.generatorAction().adopt(gen)

    logging.info("#PYTHON:  Second particle generator: e-")
    gen = DDG4.GeneratorAction(kernel, "Geant4IsotropeGenerator/IsotropE-")
    gen.Mask = 2
    gen.Particle = 'e-'
    gen.Energy = 15 * GeV
    gen.Multiplicity = 3
    kernel.generatorAction().adopt(gen)
    logging.info("#PYTHON:  Install vertex smearing for this interaction")
    gen = DDG4.GeneratorAction(kernel, "Geant4InteractionVertexSmear/SmearE-")
    gen.Mask = 2
    gen.Offset = (-20 * mm, -10 * mm, -10 * mm, 0 * ns)
    gen.Sigma = (12 * mm, 8 * mm, 8 * mm, 0 * ns)
    kernel.generatorAction().adopt(gen)
    #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    logging.info("#PYTHON:  Merge all existing interaction records")
    gen = DDG4.GeneratorAction(kernel,
                               "Geant4InteractionMerger/InteractionMerger")
    gen.OutputLevel = 4  #generator_output_level
    gen.enableUI()
    kernel.generatorAction().adopt(gen)

    logging.info("#PYTHON:  Finally generate Geant4 primaries")
    gen = DDG4.GeneratorAction(kernel, "Geant4PrimaryHandler/PrimaryHandler")
    gen.OutputLevel = 4  #generator_output_level
    gen.enableUI()
    kernel.generatorAction().adopt(gen)

    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)
    logging.info(
        '#PYTHON: +++ Geant4 worker thread configured successfully....')
    return 1
Beispiel #13
0
def run():
    batch = False
    kernel = DDG4.Kernel()
    install_dir = os.environ['DD4hepExamplesINSTALL']
    geometry = "file:" + install_dir + "/examples/ClientTests/compact/MultiSegmentCollections.xml"
    kernel.setOutputLevel('Geant4Converter', Output.DEBUG)
    kernel.setOutputLevel('Gun', Output.INFO)
    for i in xrange(len(sys.argv)):
        if sys.argv[i] == '-compact':
            geometry = sys.argv[i + 1]
        elif sys.argv[i] == '-input':
            geometry = sys.argv[i + 1]
        elif sys.argv[i] == '-batch':
            batch = True
        elif sys.argv[i] == 'batch':
            batch = True

    kernel.loadGeometry(geometry)
    geant4 = DDG4.Geant4(kernel)
    geant4.printDetectors()
    geant4.setupCshUI()
    if batch: kernel.UI = ''

    # Configure field
    field = geant4.setupTrackingField(prt=True)
    # Setup particle gun
    geant4.setupGun("Gun", particle='pi-', energy=50 * GeV, multiplicity=1)

    # Now the test calorimeter with multiple collections
    seq, act = geant4.setupCalorimeter('TestCal')

    # And handle the simulation particles.
    part = DDG4.GeneratorAction(kernel,
                                "Geant4ParticleHandler/ParticleHandler")
    kernel.generatorAction().adopt(part)
    part.MinimalKineticEnergy = 1 * MeV
    part.enableUI()

    # Add the particle dumper to associate the MC truth
    evt = DDG4.EventAction(kernel, "Geant4ParticleDumpAction/ParticleDump")
    kernel.eventAction().adopt(evt)
    evt.enableUI()

    # Add the hit dumper BEFORE any hit truth is fixed
    evt = DDG4.EventAction(kernel, "Geant4HitDumpAction/RawDump")
    kernel.eventAction().adopt(evt)
    evt.enableUI()

    # Add the hit dumper to the event action sequence
    evt = DDG4.EventAction(kernel, "Geant4HitTruthHandler/HitTruth")
    kernel.eventAction().adopt(evt)
    evt.enableUI()

    # Add the hit dumper AFTER any hit truth is fixed. We should see the reduced track references
    evt = DDG4.EventAction(kernel, "Geant4HitDumpAction/HitDump")
    kernel.eventAction().adopt(evt)
    evt.enableUI()

    # Configure I/O
    evt_root = geant4.setupROOTOutput('RootOutput',
                                      'Multi_coll_' +
                                      time.strftime('%Y-%m-%d_%H-%M'),
                                      mc_truth=True)
    evt_root.HandleMCTruth = False

    # Now build the physics list:
    phys = kernel.physicsList()
    phys.extends = 'QGSP_BERT'
    phys.enableUI()
    phys.dump()
    # and run
    geant4.execute()
Beispiel #14
0
def run():
    kernel = DDG4.Kernel()
    install_dir = os.environ['DD4hepExamplesINSTALL']
    kernel.loadGeometry("file:" + install_dir +
                        "/examples/ClientTests/compact/SiliconBlock.xml")

    DDG4.importConstants(kernel.detectorDescription(), debug=False)
    geant4 = DDG4.Geant4(kernel, tracker='Geant4TrackerCombineAction')
    geant4.printDetectors()
    # Configure UI
    if len(sys.argv) > 1:
        geant4.setupCshUI(macro=sys.argv[1])
    else:
        geant4.setupCshUI()

    # Configure field
    field = geant4.setupTrackingField(prt=True)
    # Configure Event actions
    prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
    prt.OutputLevel = Output.DEBUG
    prt.OutputType = 3  # Print both: table and tree
    kernel.eventAction().adopt(prt)

    generator_output_level = Output.INFO

    # Configure G4 geometry setup
    seq, act = geant4.addDetectorConstruction(
        "Geant4DetectorGeometryConstruction/ConstructGeo")
    act.DebugMaterials = True
    act.DebugElements = False
    act.DebugVolumes = True
    act.DebugShapes = True

    # Configure I/O
    evt_root = geant4.setupROOTOutput(
        'RootOutput', 'SiliconBlock_' + time.strftime('%Y-%m-%d_%H-%M'))

    # Setup particle gun
    gun = geant4.setupGun("Gun",
                          particle='mu-',
                          energy=20 * GeV,
                          multiplicity=1)
    gun.OutputLevel = generator_output_level

    # And handle the simulation particles.
    part = DDG4.GeneratorAction(kernel,
                                "Geant4ParticleHandler/ParticleHandler")
    kernel.generatorAction().adopt(part)
    part.SaveProcesses = ['Decay']
    part.MinimalKineticEnergy = 100 * MeV
    part.OutputLevel = Output.INFO  #generator_output_level
    part.enableUI()
    user = DDG4.Action(kernel,
                       "Geant4TCUserParticleHandler/UserParticleHandler")
    user.TrackingVolume_Zmax = 3.0 * m
    user.TrackingVolume_Rmax = 3.0 * m
    user.enableUI()
    part.adopt(user)

    geant4.setupTracker('SiliconBlockUpper')
    geant4.setupTracker('SiliconBlockDown')

    # Now build the physics list:
    phys = geant4.setupPhysics('QGSP_BERT')
    ph = DDG4.PhysicsList(kernel, 'Geant4PhysicsList/Myphysics')
    ph.addParticleConstructor('G4Geantino')
    ph.addParticleConstructor('G4BosonConstructor')
    ph.enableUI()
    phys.adopt(ph)
    phys.dump()

    geant4.execute()
Beispiel #15
0
def run():
  hlp = False
  vis = False
  dump = False
  batch = False
  install_dir = os.environ['DD4hepINSTALL']
  #
  for i in list(range(len(sys.argv))):
    c = sys.argv[i].upper()
    if c.find('BATCH') < 2 and c.find('BATCH') >= 0:
      batch = True
    elif c[:4] == '-VIS':
      vis = True
    elif c[:4] == '-DUM':
      dump = True
    elif c[:2] == '-H':
      hlp = True

  if hlp:
    help()
    sys.exit(1)

  kernel = DDG4.Kernel()
  description = kernel.detectorDescription()
  install_dir = os.environ['DD4hepExamplesINSTALL']
  geant4 = DDG4.Geant4(kernel, tracker='Geant4TrackerCombineAction')
  #
  logger.info("#  Configure UI")
  ui = None
  if batch:
    geant4.setupCshUI(ui=None, vis=None)
    kernel.UI = 'UI'
  else:
    ui = geant4.setupCshUI(vis=vis)

  kernel.loadGeometry(str("file:" + install_dir + "/examples/ClientTests/compact/NestedBoxReflection.xml"))
  DDG4.importConstants(description)

  geant4.printDetectors()
  if dump:
    seq, act = geant4.addDetectorConstruction("Geant4DetectorGeometryConstruction/ConstructGeo")
    act.DebugReflections = True
    act.DebugMaterials = False
    act.DebugElements = False
    act.DebugVolumes = False
    act.DebugShapes = False
    act.DumpHierarchy = ~0x0

  logger.info("#  Configure G4 magnetic field tracking")
  geant4.setupTrackingField()

  logger.info("#  Setup random generator")
  rndm = DDG4.Action(kernel, 'Geant4Random/Random')
  rndm.Seed = 987654321
  rndm.initialize()
  #
  logger.info("#  Configure Event actions")
  prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
  prt.OutputType = 3  # Print both: table and tree
  prt.OutputLevel = Output.INFO
  kernel.eventAction().adopt(prt)
  #
  logger.info("#  Configure I/O")
  geant4.setupROOTOutput('RootOutput', 'BoxReflect_' + time.strftime('%Y-%m-%d_%H-%M'))
  #
  gen = DDG4.GeneratorAction(kernel, "Geant4GeneratorActionInit/GenerationInit")
  gen.enableUI()
  kernel.generatorAction().adopt(gen)
  #
  logger.info("#  Generation of isotrope tracks of a given multiplicity with overlay:")
  gen = DDG4.GeneratorAction(kernel, "Geant4ParticleGun/IsotropE+")
  gen.mask = 4
  gen.isotrop = True
  gen.particle = 'e+'
  gen.energy = 100 * GeV
  gen.multiplicity = 200
  gen.position = (0 * m, 0 * m, 0 * m)
  gen.direction = (0, 0, 1.)
  gen.distribution = 'uniform'
  gen.standalone = False
  # gen.PhiMin = 0.0*rad
  # gen.PhiMax = 2.0*math.pi*rad
  # gen.ThetaMin = 0.0*math.pi*rad
  # gen.ThetaMax = 1.0*math.pi*rad
  gen.enableUI()
  kernel.generatorAction().adopt(gen)
  #
  logger.info("#  Merge all existing interaction records")
  gen = DDG4.GeneratorAction(kernel, "Geant4InteractionMerger/InteractionMerger")
  gen.OutputLevel = 4  # generator_output_level
  gen.enableUI()
  kernel.generatorAction().adopt(gen)
  #
  logger.info("#  Finally generate Geant4 primaries")
  gen = DDG4.GeneratorAction(kernel, "Geant4PrimaryHandler/PrimaryHandler")
  gen.OutputLevel = 4  # generator_output_level
  gen.enableUI()
  kernel.generatorAction().adopt(gen)
  #
  logger.info("#  ....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 = 3.0 * m
  user.TrackingVolume_Rmax = 3.0 * m
  user.enableUI()
  part.adopt(user)
  #
  logger.info("#  Now setup the calorimeters")
  seq, actions = geant4.setupDetectors()
  #
  logger.info("#  Now build the physics list:")
  geant4.setupPhysics('QGSP_BERT')
  ph = geant4.addPhysics(str('Geant4PhysicsList/Myphysics'))
  ph.addPhysicsConstructor(str('G4StepLimiterPhysics'))
  #
  # Add special particle types from specialized physics constructor
  part = geant4.addPhysics('Geant4ExtraParticles/ExtraParticles')
  part.pdgfile = os.path.join(install_dir, 'examples/DDG4/examples/particle.tbl')
  #
  # Add global range cut
  rg = geant4.addPhysics('Geant4DefaultRangeCut/GlobalRangeCut')
  rg.RangeCut = 0.7 * mm
  #
  #
  if ui and vis:
    cmds = []
    cmds.append('/control/verbose 2')
    cmds.append('/run/initialize')
    cmds.append('/vis/open OGL')
    cmds.append('/vis/verbose errors')
    cmds.append('/vis/drawVolume')
    cmds.append('/vis/viewer/set/viewpointThetaPhi 55. 45.')
    cmds.append('/vis/scene/add/axes 0 0 0 3 m')
    ui.Commands = cmds

  kernel.configure()
  kernel.initialize()

  # DDG4.setPrintLevel(Output.DEBUG)
  kernel.run()
  kernel.terminate()
Beispiel #16
0
def run():
    geo = None
    vis = False
    batch = False
    install_dir = os.environ['DD4hepINSTALL']
    for i in list(range(len(sys.argv))):
        c = sys.argv[i].upper()
        if c.find('BATCH') < 2 and c.find('BATCH') >= 0:
            batch = True
        elif c[:4] == '-GEO':
            geo = sys.argv[i + 1]
        elif c[:4] == '-VIS':
            vis = True

    if not geo:
        help()
        sys.exit(1)

    import DDG4
    Output = DDG4.OutputLevel
    kernel = DDG4.Kernel()
    # Configure UI
    geant4 = DDG4.Geant4(kernel, tracker='Geant4TrackerCombineAction')
    if batch:
        ui = geant4.setupCshUI(ui=None, vis=None)
        kernel.UI = 'UI'
    else:
        ui = geant4.setupCshUI(vis=vis)
    kernel.loadGeometry(geo)
    # Configure field
    geant4.setupTrackingField(prt=True)

    logger.info("#  Setup random generator")
    rndm = DDG4.Action(kernel, 'Geant4Random/Random')
    rndm.Seed = 987654321
    rndm.initialize()
    #
    # Setup detector
    seq, act = geant4.setupDetectors()
    #
    # Configure I/O
    geant4.setupROOTOutput('RootOutput',
                           'CheckShape_' + time.strftime('%Y-%m-%d_%H-%M'),
                           mc_truth=True)
    #
    # Setup particle gun
    geant4.setupGun(name="Gun",
                    particle='e-',
                    energy=100 * GeV,
                    isotrop=True,
                    multiplicity=1,
                    position=(0 * m, 0 * m, 0 * m),
                    PhiMin=0.0 * rad,
                    PhiMax=math.pi * 2.0 * rad,
                    ThetaMin=0.0 * rad,
                    ThetaMax=math.pi * rad)
    #
    prt = DDG4.EventAction(kernel, str('Geant4ParticlePrint/ParticlePrint'))
    prt.OutputLevel = Output.INFO
    prt.OutputType = 3  # Print both: table and tree
    kernel.eventAction().adopt(prt)
    part = DDG4.GeneratorAction(kernel,
                                str('Geant4ParticleHandler/ParticleHandler'))
    kernel.generatorAction().adopt(part)
    part.MinimalKineticEnergy = 100 * MeV
    part.SaveProcesses = ['Decay']
    part.OutputLevel = 5  # generator_output_level
    part.enableUI()
    user = DDG4.Action(kernel,
                       str('Geant4TCUserParticleHandler/UserParticleHandler'))
    user.TrackingVolume_Rmax = 3.0 * m
    user.TrackingVolume_Zmax = 2.0 * m
    user.enableUI()
    part.adopt(user)
    #
    #
    prt = DDG4.EventAction(kernel, str('Geant4ParticlePrint/ParticlePrint'))
    prt.OutputLevel = Output.INFO
    prt.OutputType = 3  # Print both: table and tree
    kernel.eventAction().adopt(prt)
    #
    # Now build the physics list:
    phys = geant4.setupPhysics(str('QGSP_BERT'))
    ph = geant4.addPhysics(str('Geant4PhysicsList/Myphysics'))
    ph.addPhysicsConstructor(str('G4StepLimiterPhysics'))
    ph.addParticleConstructor(str('G4Geantino'))
    ph.addParticleConstructor(str('G4BosonConstructor'))
    #
    # Add special particle types from specialized physics constructor
    part = geant4.addPhysics('Geant4ExtraParticles/ExtraParticles')
    part.pdgfile = os.path.join(install_dir,
                                'examples/DDG4/examples/particle.tbl')
    #
    # Add global range cut
    rg = geant4.addPhysics('Geant4DefaultRangeCut/GlobalRangeCut')
    rg.RangeCut = 0.7 * mm
    #
    phys.dump()
    #
    cmds = []
    if vis:
        cmds.append('/control/verbose 2')
        cmds.append('/run/initialize')
        cmds.append('/vis/open OGL')
        cmds.append('/vis/verbose errors')
        cmds.append('/vis/drawVolume')
        cmds.append('/vis/viewer/set/viewpointThetaPhi 55. 11.')
        cmds.append('/vis/scene/add/axes 0 0 0 1 m')
    #
    #  cmds.append('/ddg4/ConstructGeometry/printVolume /world_volume_1/Shape_Test_0/Shape_Test_vol_0_0')
    #  cmds.append('/ddg4/UI/exit')
    #
    ui.Commands = cmds
    kernel.NumEvents = 0
    kernel.configure()
    kernel.initialize()
    kernel.run()
    kernel.terminate()
Beispiel #17
0
def run():
    hlp = False
    vis = False
    batch = False
    #
    for i in list(range(len(sys.argv))):
        c = sys.argv[i].upper()
        if c.find('BATCH') < 2 and c.find('BATCH') >= 0:
            batch = True
        elif c[:4] == '-VIS':
            vis = True
        elif c[:2] == '-H':
            hlp = True

    if hlp:
        help()
        sys.exit(1)

    kernel = DDG4.Kernel()
    description = kernel.detectorDescription()
    install_dir = os.environ['DD4hepINSTALL']
    kernel.loadGeometry(
        str("file:" + install_dir + "/DDDetectors/compact/SiD.xml"))
    DDG4.importConstants(description)

    geant4 = DDG4.Geant4(kernel, tracker='Geant4TrackerCombineAction')
    geant4.printDetectors()
    logger.info("#  Configure UI")
    ui = None
    if batch:
        geant4.setupCshUI(ui=None, vis=None)
        kernel.UI = 'UI'
    else:
        ui = geant4.setupCshUI(vis=vis)

    logger.info("#  Configure G4 magnetic field tracking")
    geant4.setupTrackingField()

    logger.info("#  Setup random generator")
    rndm = DDG4.Action(kernel, 'Geant4Random/Random')
    rndm.Seed = 987654321
    rndm.initialize()
    # rndm.showStatus()

    logger.info("#  Configure Run actions")
    run1 = DDG4.RunAction(kernel, 'Geant4TestRunAction/RunInit')
    run1.Property_int = 12345
    run1.Property_double = -5e15 * keV
    run1.Property_string = 'Startrun: Hello_2'
    logger.info("%s %s %s", run1.Property_string, str(run1.Property_double),
                str(run1.Property_int))
    run1.enableUI()
    kernel.registerGlobalAction(run1)
    kernel.runAction().adopt(run1)

    logger.info("#  Configure Event actions")
    prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
    prt.OutputLevel = Output.INFO
    prt.OutputType = 3  # Print both: table and tree
    kernel.eventAction().adopt(prt)

    logger.info("""
  Configure I/O
  """)
    # evt_lcio = geant4.setupLCIOOutput('LcioOutput','CLICSiD_'+time.strftime('%Y-%m-%d_%H-%M'))
    # evt_lcio.OutputLevel = Output.ERROR

    geant4.setupROOTOutput('RootOutput',
                           'CLICSiD_' + time.strftime('%Y-%m-%d_%H-%M'))

    gen = DDG4.GeneratorAction(kernel,
                               "Geant4GeneratorActionInit/GenerationInit")
    kernel.generatorAction().adopt(gen)

    # VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
    logger.info("""
  Generation of isotrope tracks of a given multiplicity with overlay:
  """)
    logger.info("#  First particle generator: pi+")
    gen = DDG4.GeneratorAction(kernel, "Geant4IsotropeGenerator/IsotropPi+")
    gen.Mask = 1
    gen.Particle = 'pi+'
    gen.Energy = 100 * GeV
    gen.Multiplicity = 2
    gen.Distribution = 'cos(theta)'
    kernel.generatorAction().adopt(gen)
    logger.info("#  Install vertex smearing for this interaction")
    gen = DDG4.GeneratorAction(kernel, "Geant4InteractionVertexSmear/SmearPi+")
    gen.Mask = 1
    gen.Offset = (20 * mm, 10 * mm, 10 * mm, 0 * ns)
    gen.Sigma = (4 * mm, 1 * mm, 1 * mm, 0 * ns)
    kernel.generatorAction().adopt(gen)

    logger.info("#  Second particle generator: e-")
    gen = DDG4.GeneratorAction(kernel, "Geant4IsotropeGenerator/IsotropE-")
    gen.Mask = 2
    gen.Particle = 'e-'
    gen.Energy = 25 * GeV
    gen.Multiplicity = 2
    gen.Distribution = 'uniform'
    kernel.generatorAction().adopt(gen)
    logger.info("  Install vertex smearing for this interaction")
    gen = DDG4.GeneratorAction(kernel, "Geant4InteractionVertexSmear/SmearE-")
    gen.Mask = 2
    gen.Offset = (-20 * mm, -10 * mm, -10 * mm, 0 * ns)
    gen.Sigma = (12 * mm, 8 * mm, 8 * mm, 0 * ns)
    kernel.generatorAction().adopt(gen)

    logger.info("#  Second particle generator: mu+")
    gen = DDG4.GeneratorAction(kernel, "Geant4IsotropeGenerator/IsotropMu+")
    gen.Mask = 3
    gen.Particle = 'mu+'
    gen.Energy = 100 * GeV
    gen.Multiplicity = 3
    gen.Distribution = 'uniform'
    kernel.generatorAction().adopt(gen)
    # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    logger.info("#  Merge all existing interaction records")
    gen = DDG4.GeneratorAction(kernel,
                               "Geant4InteractionMerger/InteractionMerger")
    gen.OutputLevel = 4  # generator_output_level
    gen.enableUI()
    kernel.generatorAction().adopt(gen)
    #
    logger.info("#  Finally generate Geant4 primaries")
    gen = DDG4.GeneratorAction(kernel, "Geant4PrimaryHandler/PrimaryHandler")
    gen.OutputLevel = 4  # generator_output_level
    gen.enableUI()
    kernel.generatorAction().adopt(gen)
    #
    logger.info("#  ....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)
    #
    logger.info("#  Setup global filters fur use in sensitive detectors")
    f1 = DDG4.Filter(kernel, 'GeantinoRejectFilter/GeantinoRejector')
    f2 = DDG4.Filter(kernel, 'ParticleRejectFilter/OpticalPhotonRejector')
    f2.particle = 'opticalphoton'
    f3 = DDG4.Filter(kernel, 'ParticleSelectFilter/OpticalPhotonSelector')
    f3.particle = 'opticalphoton'
    f4 = DDG4.Filter(kernel, 'EnergyDepositMinimumCut')
    f4.Cut = 10 * MeV
    f4.enableUI()
    kernel.registerGlobalFilter(f1)
    kernel.registerGlobalFilter(f2)
    kernel.registerGlobalFilter(f3)
    kernel.registerGlobalFilter(f4)
    #
    logger.info("#  First the tracking detectors")
    seq, act = geant4.setupTracker('SiVertexBarrel')
    seq.adopt(f1)
    act.adopt(f1)
    #
    seq, act = geant4.setupTracker('SiVertexEndcap')
    seq.adopt(f1)
    #
    seq, act = geant4.setupTracker('SiTrackerBarrel')
    seq, act = geant4.setupTracker('SiTrackerEndcap')
    seq, act = geant4.setupTracker('SiTrackerForward')
    logger.info("#  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')
    #
    logger.info("#  Now build the physics list:")
    phys = geant4.setupPhysics('QGSP_BERT')
    ph = geant4.addPhysics(str('Geant4PhysicsList/Myphysics'))
    ph.addPhysicsConstructor(str('G4StepLimiterPhysics'))
    #
    # Add special particle types from specialized physics constructor
    part = geant4.addPhysics(str('Geant4ExtraParticles/ExtraParticles'))
    part.pdgfile = os.path.join(install_dir,
                                'examples/DDG4/examples/particle.tbl')
    #
    # Add global range cut
    rg = geant4.addPhysics(str('Geant4DefaultRangeCut/GlobalRangeCut'))
    rg.RangeCut = 0.7 * mm
    #
    phys.dump()
    #
    #
    if ui and vis:
        cmds = []
        cmds.append('/control/verbose 2')
        cmds.append('/run/initialize')
        cmds.append('/vis/open OGL')
        cmds.append('/vis/verbose errors')
        cmds.append('/vis/drawVolume')
        cmds.append('/vis/viewer/set/viewpointThetaPhi 55. 45.')
        cmds.append('/vis/scene/add/axes 0 0 0 10 m')
        ui.Commands = cmds

    kernel.configure()
    kernel.initialize()

    # DDG4.setPrintLevel(Output.DEBUG)
    kernel.run()
    kernel.terminate()
Beispiel #18
0
def run():
    kernel = DDG4.Kernel()
    lcdd = kernel.lcdd()
    install_dir = os.environ['DD4hepINSTALL']
    example_dir = install_dir + '/examples/DDG4/examples'
    kernel.loadGeometry("file:" + install_dir +
                        "/DDDetectors/compact/SiD_Markus.xml")
    ##kernel.loadXML("file:"+example_dir+"/DDG4_field.xml")
    DDG4.importConstants(lcdd, debug=False)
    geant4 = DDG4.Geant4(kernel, tracker='Geant4TrackerCombineAction')
    geant4.printDetectors()
    # Configure UI
    #geant4.setupCshUI(macro='run.mac',ui=None)
    geant4.setupCshUI()

    field = geant4.addConfig(
        'Geant4FieldTrackingSetupAction/MagFieldTrackingSetup')
    field.stepper = "HelixSimpleRunge"
    field.equation = "Mag_UsualEqRhs"
    field.eps_min = 5e-05 * mm
    field.eps_max = 0.001 * mm
    field.min_chord_step = 0.01 * mm
    field.delta_chord = 0.25 * mm
    field.delta_intersection = 1e-05 * mm
    field.delta_one_step = 0.001 * mm
    print '+++++> ', field.name, '-> stepper  = ', field.stepper
    print '+++++> ', field.name, '-> equation = ', field.equation
    print '+++++> ', field.name, '-> eps_min  = ', field.eps_min
    print '+++++> ', field.name, '-> eps_max  = ', field.eps_max
    print '+++++> ', field.name, '-> delta_one_step = ', field.delta_one_step

    # Configure Run actions
    run1 = DDG4.RunAction(kernel, 'Geant4TestRunAction/RunInit')
    run1.enableUI()
    kernel.registerGlobalAction(run1)
    kernel.runAction().adopt(run1)

    # Configure Event actions
    prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
    prt.OutputLevel = Output.WARNING
    prt.OutputType = 3  # Print both: table and tree
    kernel.eventAction().adopt(prt)

    generator_output_level = Output.WARNING

    # Configure I/O
    evt_lcio = geant4.setupLCIOOutput(
        'LcioOutput', 'CLICSiD_' + time.strftime('%Y-%m-%d_%H-%M'))
    ##evt_lcio.OutputLevel = generator_output_level
    #evt_root = geant4.setupROOTOutput('RootOutput','CLICSiD_'+time.strftime('%Y-%m-%d_%H-%M'))

    prim = DDG4.GeneratorAction(kernel,
                                "Geant4GeneratorActionInit/GenerationInit")
    #VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
    """
  Generation of primary particles from LCIO input files
  """
    """
  # First particle file reader
  gen = DDG4.GeneratorAction(kernel,"LCIOInputAction/LCIO1");
  #gen.Input = "LCIOStdHepReader|/home/frankm/SW/data/e2e2nn_gen_1343_1.stdhep"
  #gen.Input = "LCIOStdHepReader|/home/frankm/SW/data/qq_gen_128_999.stdhep"
  #gen.Input = "LCIOStdHepReader|/home/frankm/SW/data/smuonLR_PointK_3TeV_BS_noBkg_run0001.stdhep"
  #gen.Input = "LCIOStdHepReader|/home/frankm/SW/data/bbbb_3TeV.stdhep"
  #gen.Input = "LCIOFileReader|/home/frankm/SW/data/mcparticles_pi-_5GeV.slcio"
  #gen.Input = "LCIOFileReader|/home/frankm/SW/data/mcparticles_mu-_5GeV.slcio"
  #gen.Input = "LCIOFileReader|/home/frankm/SW/data/bbbb_3TeV.slcio"
  #gen.Input = "LCIOStdHepReader|/home/frankm/SW/data/FCC-eh.stdhep"
  #gen.Input = "Geant4EventReaderHepMC|/home/frankm/SW/data/data.hepmc.txt"
  #gen.Input = "Geant4EventReaderHepMC|/home/frankm/SW/data/sherpa-2.1.1_zjets.hepmc2g"
  gen.Input = "LCIOFileReader|/afs/cern.ch/user/n/nikiforo/public/Markus/muons.slcio"
  #gen.Input = "LCIOFileReader|/afs/cern.ch/user/n/nikiforo/public/Markus/geantinos.slcio"
  gen.MomentumScale = 1.0
  gen.Mask = 1
  geant4.buildInputStage([gen],output_level=generator_output_level)
  """
    #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    gen = geant4.setupGun("Gun",
                          particle='mu+',
                          energy=20 * GeV,
                          position=(0 * mm, 0 * mm, 0 * cm),
                          multiplicity=3)
    gen.isotrop = True
    gen.direction = (1, 0, 0)
    gen.OutputLevel = generator_output_level
    gen.Standalone = False
    """
  # 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 = Output.INFO #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)
  """
    geant4.buildInputStage([prim, gen], Output.ERROR)
    """
  """
    """
  rdr = DDG4.GeneratorAction(kernel,"LcioGeneratorAction/Reader")
  rdr.zSpread = 0.0
  rdr.lorentzAngle = 0.0
  rdr.OutputLevel = DDG4.OutputLevel.INFO
  rdr.Input = "LcioEventReader|test.data"
  rdr.enableUI()
  kernel.generatorAction().adopt(rdr)
  """

    # First the tracking detectors
    seq, act = geant4.setupTracker('SiTrackerBarrel')
    seq, act = geant4.setupTracker('SiTrackerEndcap')
    seq, act = geant4.setupTracker('SiTrackerForward')
    """
  # Now the calorimeters
  seq,act = geant4.setupTracker('SiVertexBarrel')
  seq,act = geant4.setupTracker('SiVertexEndcap')

  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')
  """
    """
  scan = DDG4.SteppingAction(kernel,'Geant4MaterialScanner/MaterialScan')
  kernel.steppingAction().adopt(scan)
  """

    # Now build the physics list:
    phys = geant4.setupPhysics('QGSP_BERT')
    ph = DDG4.PhysicsList(kernel, 'Geant4PhysicsList/Myphysics')
    ph.addParticleConstructor('G4Geantino')
    ph.addParticleConstructor('G4BosonConstructor')
    ph.enableUI()
    phys.adopt(ph)
    phys.dump()

    kernel.configure()
    kernel.initialize()

    #DDG4.setPrintLevel(Output.DEBUG)
    kernel.run()
    print 'End of run. Terminating .......'
    kernel.terminate()
Beispiel #19
0
def run():
    kernel = DDG4.Kernel()
    install_dir = os.environ['DD4hepExamplesINSTALL']
    kernel.loadGeometry("file:" + install_dir +
                        "/examples/DDCodex/compact/CODEX-b-alone.xml")

    DDG4.importConstants(kernel.detectorDescription(), debug=False)
    geant4 = DDG4.Geant4(kernel, tracker='Geant4TrackerCombineAction')
    geant4.printDetectors()
    # Configure UI
    if len(sys.argv) > 1:
        geant4.setupCshUI(macro=sys.argv[1])
    else:
        geant4.setupCshUI()

    # Configure field
    field = geant4.setupTrackingField(prt=True)
    # Configure Event actions
    prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
    prt.OutputLevel = Output.WARNING
    prt.OutputType = 3  # Print both: table and tree
    kernel.eventAction().adopt(prt)

    # Configure I/O
    evt_root = geant4.setupROOTOutput(
        'RootOutput', 'CodexB_' + time.strftime('%Y-%m-%d_%H-%M'))

    # Setup particle gun

    #gun = geant4.setupGun("Gun",particle='pi+',
    gun = geant4.setupGun(
        "Gun",
        particle='mu-',
        energy=1000 * GeV,
        multiplicity=1,
        isotrop=False,
        Standalone=True,
        direction=(1, 0, 0),
        #direction=(0.866025,0,0.5),
        position='(0,0,12650)')
    #position='(0,0,0)')
    setattr(gun, 'print', True)
    """
  gen =  DDG4.GeneratorAction(kernel,"Geant4InputAction/Input")
  ##gen.Input = "Geant4EventReaderHepMC|"+ "/afs/cern.ch/work/j/jongho/Project_DD4hep/Test/DD4hep/examples/DDG4/data/hepmc_geant4.dat"
  gen.Input = "Geant4EventReaderHepMC|"+ "/afs/cern.ch/work/j/jongho/Project_DD4hep/Test/DD4hep/DDG4/examples/MinBias_HepMC.txt"
  gen.MomentumScale = 1.0
  gen.Mask = 1
  geant4.buildInputStage([gen],output_level=Output.DEBUG)
  """

    seq, action = geant4.setupTracker('CODEXb')
    #action.OutputLevel = Output.ERROR
    #seq,action = geant4.setupTracker('Shield')
    #action.OutputLevel = Output.ERROR

    # And handle the simulation particles.
    part = DDG4.GeneratorAction(kernel,
                                "Geant4ParticleHandler/ParticleHandler")
    kernel.generatorAction().adopt(part)
    part.OutputLevel = Output.INFO
    part.enableUI()
    user = DDG4.Action(kernel,
                       "Geant4TCUserParticleHandler/UserParticleHandler")
    user.TrackingVolume_Zmax = 999999. * m  # Something big. All is a tracker
    user.TrackingVolume_Rmax = 999999. * m
    user.enableUI()
    part.adopt(user)

    # Now build the physics list:
    ##phys = kernel.physicsList()
    phys = geant4.setupPhysics('QGSP_BERT')
    ph = DDG4.PhysicsList(kernel, 'Geant4PhysicsList/Myphysics')
    ph.addParticleConstructor('G4LeptonConstructor')
    ph.addParticleConstructor('G4BaryonConstructor')
    ph.addParticleConstructor('G4MesonConstructor')
    ph.addParticleConstructor('G4BosonConstructor')
    ph.enableUI()
    phys.adopt(ph)
    phys.enableUI()
    phys.dump()
    # run
    kernel.configure()
    kernel.initialize()
    kernel.run()
    kernel.terminate()
Beispiel #20
0
def run():
    import LHeD, DDG4, os, SystemOfUnits
    from DDG4 import OutputLevel as Output

    lhed = LHeD.LHeD()
    geant4 = lhed.geant4
    kernel = lhed.kernel
    lhed.loadGeometry()
    geant4.printDetectors()
    kernel.UI = "UI"
    geant4.setupCshUI()
    lhed.setupField(quiet=False)
    DDG4.importConstants(kernel.detectorDescription(), debug=False)

    dd4hep_dir = os.environ['DD4hep']
    kernel.loadXML("file:" + dd4hep_dir +
                   "/examples/LHeD/scripts/DDG4_field.xml")

    geant4 = DDG4.Geant4(kernel, tracker='Geant4TrackerCombineAction')
    geant4.printDetectors()

    # Configure G4 magnetic field tracking
    field = geant4.addConfig(
        'Geant4FieldTrackingSetupAction/MagFieldTrackingSetup')
    field.stepper = "HelixGeant4Runge"
    field.equation = "Mag_UsualEqRhs"
    field.eps_min = 5e-0520 * SystemOfUnits.mm
    field.eps_max = 0.001 * SystemOfUnits.mm
    field.min_chord_step = 0.01 * SystemOfUnits.mm
    field.delta_chord = 0.25 * SystemOfUnits.mm
    field.delta_intersection = 1e-05 * SystemOfUnits.mm
    field.delta_one_step = 0.001 * SystemOfUnits.mm
    print '+++++> ', field.name, '-> stepper  = ', field.stepper
    print '+++++> ', field.name, '-> equation = ', field.equation
    print '+++++> ', field.name, '-> eps_min  = ', field.eps_min
    print '+++++> ', field.name, '-> eps_max  = ', field.eps_max
    print '+++++> ', field.name, '-> delta_one_step = ', field.delta_one_step
    """
  # Setup random generator
  rndm = DDG4.Action(kernel,'Geant4Random/Random')
  rndm.Seed = 987654321
  rndm.initialize()
  rndm.showStatus()
  rndm.Seed = 987654321
  """

    # Configure Run actions
    run1 = DDG4.RunAction(kernel, 'Geant4TestRunAction/RunInit')
    """
  run1.Property_int    = 12345
  run1.Property_double = -5e15*keV
  run1.Property_string = 'Startrun: Hello_LHeD'
  print run1.Property_string, run1.Property_double, run1.Property_int
  """
    run1.enableUI()
    kernel.registerGlobalAction(run1)
    kernel.runAction().adopt(run1)

    # Configure Event actions
    prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
    prt.OutputLevel = Output.INFO
    prt.OutputType = 3  # Print both: table and tree
    kernel.eventAction().adopt(prt)

    # Configure I/O
    #evt_lcio = geant4.setupLCIOOutput('LcioOutput','Lhe_dip_sol_circ-higgs-bb')
    #evt_lcio.OutputLevel = Output.ERROR

    evt_root = geant4.setupROOTOutput('RootOutput',
                                      'Lhe_dip_sol_circ-higgs-bb')
    evt_root.OutputLevel = Output.INFO

    gen = DDG4.GeneratorAction(kernel,
                               "Geant4GeneratorActionInit/GenerationInit")
    kernel.generatorAction().adopt(gen)
    """
  # First particle generator: e-  non-isotropic generation using Gun: 
  gun = DDG4.GeneratorAction(kernel,"Geant4ParticleGenerator/Gun");
  gun.Particle = 'e-'
  gun.Energy = 60 * GeV
  gun.Multiplicity = 1
  gun.Position = (0.*mm,0.*mm,0.*mm)
  gun.Direction = (1.,0.,0.)
  gun.Mask = 2
  gun.enableUI()
  kernel.generatorAction().adopt(gun)
  # Install vertex smearing for this primary e-
  gen = DDG4.GeneratorAction(kernel,"Geant4InteractionVertexSmear/SmearE-");
  gen.Mask = 1
  gen.Sigma = (0*mm, 0*mm, 0*mm, 0*ns)
  kernel.generatorAction().adopt(gen)
  """

    #VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
    """
  Generation of isotrope tracks of a given multiplicity with overlay:
  """
    #VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
    """
  # First particle generator: pi+
  gen = DDG4.GeneratorAction(kernel,"Geant4IsotropeGenerator/IsotropPi+");
  gen.Particle = 'pi+'
  gen.Energy = 200*GeV
  gen.Multiplicity = 1
  gen.Mask = 1
  kernel.generatorAction().adopt(gen)
  # Install vertex smearing for this interaction
  gen = DDG4.GeneratorAction(kernel,"Geant4InteractionVertexSmear/SmearPi+");
  gen.Mask = 1
  gen.Offset = (20*mm, 10*mm, 10*mm, 0*ns)
  gen.Sigma = (4*mm, 1*mm, 1*mm, 0*ns)
  kernel.generatorAction().adopt(gen)

  # Second particle generator: e-
  gen = DDG4.GeneratorAction(kernel,"Geant4IsotropeGenerator/IsotropE-");
  gen.Particle = 'e-'
  gen.Energy = 60 * GeV
  gen.Multiplicity = 2
  gen.Mask = 2
  kernel.generatorAction().adopt(gen)
  # Install vertex smearing for this interaction
  gen = DDG4.GeneratorAction(kernel,"Geant4InteractionVertexSmear/SmearE-");
  gen.Mask = 2
  gen.Offset = (-20*mm, -10*mm, -10*mm, 0*ns)
  gen.Sigma = (12*mm, 8*mm, 8*mm, 0*ns)
  kernel.generatorAction().adopt(gen)
  """
    #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    #VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
    """
  Generation of primary particles from LCIO input files
  """
    #VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV

    # First particle file reader
    gen = DDG4.GeneratorAction(kernel, "LCIOInputAction/LCIO1")
    # gen.Input = "LCIOStdHepReader|/afs/.cern.ch/project/lhec/software/aidasoft/DD4hep/DD4hep/files/NC_bb_tag_2_pythia_events.hep"
    #gen.Input = "LCIOStdHepReader|/opt/DD4hep/files/NC_bb_tag_2_pythia_events.hep"
    gen.Input = "LCIOStdHepReader|/opt/DD4hep/files/lhec_for_peter/tag_2_pythia_events.hep"
    # gen.Input = "LCIOStdHepReader|/opt/DD4hep/files/single-top-tag_1_pythia_events.hep"

    # gen.Input = "Geant4EventReaderHepMC|/opt/DD4hep/files/ePb-q2-0-i.mc2"
    # gen.Input = "LCIOStdHepReader|/opt/DD4hep/files/single-top-tag_1_pythia_events.hep"
    # gen.Input = "LCIOStdHepReader|/opt/DD4hep/files/root.hep"

    gen.OutputLevel = 2  # generator_output_level
    gen.MomentumScale = 1.0
    gen.Mask = 1
    gen.enableUI()
    kernel.generatorAction().adopt(gen)

    # Install vertex smearing for this interaction
    gen = DDG4.GeneratorAction(kernel, "Geant4InteractionVertexSmear/Smear1")
    gen.OutputLevel = 4  #generator_output_level
    gen.Mask = 1
    gen.Offset = (-20 * SystemOfUnits.mm, -10 * SystemOfUnits.mm,
                  -10 * SystemOfUnits.mm, 0 * SystemOfUnits.ns)
    gen.Sigma = (12 * SystemOfUnits.mm, 8 * SystemOfUnits.mm,
                 8 * SystemOfUnits.mm, 0 * SystemOfUnits.ns)
    gen.enableUI()
    kernel.generatorAction().adopt(gen)

    #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    # Merge all existing interaction records
    gen = DDG4.GeneratorAction(kernel,
                               "Geant4InteractionMerger/InteractionMerger")
    gen.OutputLevel = 4  #generator_output_level
    gen.enableUI()
    kernel.generatorAction().adopt(gen)

    # Finally generate Geant4 primaries
    gen = DDG4.GeneratorAction(kernel, "Geant4PrimaryHandler/PrimaryHandler")
    gen.OutputLevel = 4  #generator_output_level
    gen.enableUI()
    kernel.generatorAction().adopt(gen)

    # And handle the simulation particles.
    part = DDG4.GeneratorAction(kernel,
                                "Geant4ParticleHandler/ParticleHandler")
    kernel.generatorAction().adopt(part)
    #part.SaveProcesses = ['conv','Decay']
    part.SaveProcesses = ['Decay']
    part.MinimalKineticEnergy = 10 * SystemOfUnits.MeV
    part.OutputLevel = 5  # generator_output_level
    part.enableUI()

    user = DDG4.Action(kernel,
                       "Geant4TCUserParticleHandler/UserParticleHandler")
    user.TrackingVolume_Zmax = DDG4.EcalEndcap_zmin_fwd
    user.TrackingVolume_Rmax = DDG4.EcalBarrel_rmin
    user.enableUI()
    part.adopt(user)
    """
  rdr = DDG4.GeneratorAction(kernel,"LcioGeneratorAction/Reader")
  rdr.zSpread = 0.0
  rdr.lorentzAngle = 0.0
  rdr.OutputLevel = DDG4.OutputLevel.INFO
  rdr.Input = "LcioEventReader|test.data"
  rdr.enableUI()
  kernel.generatorAction().adopt(rdr)
  """

    # Setup global filters fur use in sensntive detectors
    f1 = DDG4.Filter(kernel, 'GeantinoRejectFilter/GeantinoRejector')
    kernel.registerGlobalFilter(f1)
    f2 = DDG4.Filter(kernel, 'ParticleRejectFilter/OpticalPhotonRejector')
    f2.particle = 'opticalphoton'
    kernel.registerGlobalFilter(f2)
    f3 = DDG4.Filter(kernel, 'ParticleSelectFilter/OpticalPhotonSelector')
    f3.particle = 'opticalphoton'
    kernel.registerGlobalFilter(f3)

    f4 = DDG4.Filter(kernel, 'EnergyDepositMinimumCut')
    f4.Cut = 0.5 * SystemOfUnits.MeV
    f4.enableUI()
    kernel.registerGlobalFilter(f4)

    # First the tracking detectors
    seq, act = geant4.setupTracker('SiVertexBarrel')
    seq.adopt(f1)
    act.adopt(f1)

    seq, act = geant4.setupTracker('SiTrackerBarrel')
    seq.adopt(f1)
    act.adopt(f1)
    seq, act = geant4.setupTracker('SiTrackerForward')
    seq.adopt(f1)
    act.adopt(f1)
    seq, act = geant4.setupTracker('SiTrackerBackward')
    seq.adopt(f1)
    act.adopt(f1)

    # Now the calorimeters
    seq, act = geant4.setupCalorimeter('EcalBarrel')
    seq.adopt(f3)
    act.adopt(f3)
    seq.adopt(f4)
    act.adopt(f4)

    seq, act = geant4.setupCalorimeter('EcalEndcap_fwd')
    seq.adopt(f3)
    act.adopt(f3)
    seq.adopt(f4)
    act.adopt(f4)
    seq, act = geant4.setupCalorimeter('EcalEndcap_bwd')
    seq.adopt(f3)
    act.adopt(f3)
    seq.adopt(f4)
    act.adopt(f4)

    seq, act = geant4.setupCalorimeter('HcalBarrel')
    seq.adopt(f3)
    act.adopt(f3)
    seq.adopt(f4)
    act.adopt(f4)
    seq, act = geant4.setupCalorimeter('HcalEndcap_fwd')
    seq.adopt(f3)
    act.adopt(f3)
    seq.adopt(f4)
    act.adopt(f4)
    seq, act = geant4.setupCalorimeter('HcalEndcap_bwd')
    seq.adopt(f3)
    act.adopt(f3)
    seq.adopt(f4)
    act.adopt(f4)

    seq, act = geant4.setupCalorimeter('HcalPlug_fwd')
    seq.adopt(f3)
    act.adopt(f3)
    seq.adopt(f4)
    act.adopt(f4)
    seq, act = geant4.setupCalorimeter('HcalPlug_bwd')
    seq.adopt(f3)
    act.adopt(f3)
    seq.adopt(f4)
    act.adopt(f4)

    seq, act = geant4.setupCalorimeter('MuonBarrel')
    seq.adopt(f2)
    act.adopt(f2)
    seq, act = geant4.setupCalorimeter('MuonEndcap_fwd1')
    seq.adopt(f2)
    act.adopt(f2)
    seq, act = geant4.setupCalorimeter('MuonEndcap_fwd2')
    seq.adopt(f2)
    act.adopt(f2)
    seq, act = geant4.setupCalorimeter('MuonEndcap_bwd1')
    seq.adopt(f2)
    act.adopt(f2)
    seq, act = geant4.setupCalorimeter('MuonEndcap_bwd2')
    seq.adopt(f2)
    act.adopt(f2)
    """
  scan = DDG4.SteppingAction(kernel,'Geant4MaterialScanner/MaterialScan')
  kernel.steppingAction().adopt(scan)
  """

    # Now build the physics list:
    phys = geant4.setupPhysics('QGSP_BERT')
    ph = DDG4.PhysicsList(kernel, 'Geant4PhysicsList/Myphysics')
    ph.addParticleConstructor('G4Geantino')
    ph.addParticleConstructor('G4BosonConstructor')
    ph.addParticleConstructor('G4LeptonConstructor')
    ph.addParticleProcess('e[+-]', 'G4eMultipleScattering', -1, 1, 1)
    ph.addPhysicsConstructor('G4OpticalPhysics')
    ph.enableUI()
    phys.adopt(ph)
    phys.dump()

    kernel.configure()
    kernel.initialize()

    #DDG4.setPrintLevel(Output.DEBUG)
    kernel.run()
    print 'End of run. Terminating .......'
    kernel.terminate()
Beispiel #21
0
def run():
  import CLICSid
  import DDG4
  import os
  import sys
  from DDG4 import OutputLevel as Output

  sid = CLICSid.CLICSid(no_physics=False)
  geant4 = sid.geant4
  kernel = sid.kernel
  sid.loadGeometry()
  geant4.printDetectors()
  kernel.UI = 'UI'
  if len(sys.argv) >= 2 and sys.argv[1] == "batch":
    DDG4.setPrintLevel(DDG4.OutputLevel.WARNING)
    kernel.UI = ''
  geant4.setupCshUI()
  sid.setupField(quiet=False)
  DDG4.importConstants(kernel.detectorDescription(), debug=False)

  prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
  prt.OutputLevel = Output.INFO
  prt.OutputType = 3  # Print both: table and tree
  kernel.eventAction().adopt(prt)

  # First particle file reader
  gen = DDG4.GeneratorAction(kernel, "Geant4GeneratorActionInit/GenerationInit")
  kernel.generatorAction().adopt(gen)
  input = DDG4.GeneratorAction(kernel, "Geant4InputAction/Input")
  fname = os.environ['DD4hepExamplesINSTALL'] + '/examples/DDG4/data/hepmc_geant4.dat'
  input.Input = "Geant4EventReaderHepMC|" + fname
  input.MomentumScale = 1.0
  input.Mask = 1
  kernel.generatorAction().adopt(input)

  # Merge all existing interaction records
  merger = DDG4.GeneratorAction(kernel, "Geant4InteractionMerger/InteractionMerger")
  merger.enableUI()
  kernel.generatorAction().adopt(merger)

  logger.info("#  Finally generate Geant4 primaries")
  gen = DDG4.GeneratorAction(kernel, "Geant4PrimaryHandler/PrimaryHandler")
  gen.OutputLevel = 4  # generator_output_level
  gen.enableUI()
  kernel.generatorAction().adopt(gen)

  # And handle the simulation particles.
  part = DDG4.GeneratorAction(kernel, "Geant4ParticleHandler/ParticleHandler")
  kernel.generatorAction().adopt(part)
  part.OutputLevel = Output.INFO
  part.enableUI()

  logger.info("#  Configure Event actions")
  prt = DDG4.EventAction(kernel, 'Geant4ParticlePrint/ParticlePrint')
  prt.OutputLevel = Output.INFO
  prt.OutputType = 3  # Print both: table and tree
  kernel.eventAction().adopt(prt)

  user = DDG4.Action(kernel, "Geant4TCUserParticleHandler/UserParticleHandler")
  user.TrackingVolume_Zmax = DDG4.EcalEndcap_zmin
  user.TrackingVolume_Rmax = DDG4.EcalBarrel_rmin
  user.enableUI()
  part.adopt(user)
  #
  sid.setupDetectors()
  sid.setupPhysics('QGSP_BERT')
  sid.test_run(have_geo=True, num_events=1)