Skip to content
Snippets Groups Projects
ParticleHandler.py 5.49 KiB
Newer Older
"""Configuration Helper for ParticleHandler"""
Marko Petric's avatar
Marko Petric committed
from DDSim.Helper.ConfigHelper import ConfigHelper
from g4units import MeV, mm
import logging

logger = logging.getLogger(__name__)
Marko Petric's avatar
Marko Petric committed

class ParticleHandler(ConfigHelper):
  """Configuration for the Particle Handler/ MCTruth treatment"""
Marko Petric's avatar
Marko Petric committed

  def __init__(self):
    super(ParticleHandler, self).__init__()
    self._saveProcesses = ['Decay']
Marko Petric's avatar
Marko Petric committed
    self._minimalKineticEnergy = 1 * MeV
    self._keepAllParticles = False
    self._printEndTracking = False
    self._printStartTracking = False
Marko Petric's avatar
Marko Petric committed
    self._minDistToParentVertex = 2.2e-14 * mm
    self._enableDetailedHitsAndParticleInfo = False
    self._userParticleHandler = "Geant4TCUserParticleHandler"
    self._closeProperties()

  @property
  def enableDetailedHitsAndParticleInfo(self):
Frank Gaede's avatar
Frank Gaede committed
    """Enable lots of printout on simulated hits and MC-truth information"""
    return self._enableDetailedHitsAndParticleInfo

  @enableDetailedHitsAndParticleInfo.setter
Marko Petric's avatar
Marko Petric committed
  def enableDetailedHitsAndParticleInfo(self, val):
    self._enableDetailedHitsAndParticleInfo = val

Marko Petric's avatar
Marko Petric committed
  def userParticleHandler(self):
    """Optionally enable an extended Particle Handler"""
    return self._userParticleHandler
Marko Petric's avatar
Marko Petric committed

  @userParticleHandler.setter
Marko Petric's avatar
Marko Petric committed
  def userParticleHandler(self, val):
    self._userParticleHandler = val
Marko Petric's avatar
Marko Petric committed
  def minDistToParentVertex(self):
    """Minimal distance between particle vertex and endpoint of parent after
    which the vertexIsNotEndpointOfParent flag is set
    """
    return self._minDistToParentVertex
Marko Petric's avatar
Marko Petric committed

Marko Petric's avatar
Marko Petric committed
  def minDistToParentVertex(self, val):

  @property
  def saveProcesses(self):
    """List of processes to save, on command line give as whitespace separated string in quotation marks"""
    return self._saveProcesses
Marko Petric's avatar
Marko Petric committed

  @saveProcesses.setter
  def saveProcesses(self, stringVal):
Marko Petric's avatar
Marko Petric committed
    self._saveProcesses = ConfigHelper.makeList(stringVal)

  @property
  def minimalKineticEnergy(self):
    """MinimalKineticEnergy to store particles created in the tracking region"""
    return self._minimalKineticEnergy
Marko Petric's avatar
Marko Petric committed

  @minimalKineticEnergy.setter
Marko Petric's avatar
Marko Petric committed
  def minimalKineticEnergy(self, val):
    self._minimalKineticEnergy = val

  @property
Marko Petric's avatar
Marko Petric committed
  def keepAllParticles(self):
    """ Keep all created particles """
    return self._keepAllParticles
Marko Petric's avatar
Marko Petric committed

  @keepAllParticles.setter
Marko Petric's avatar
Marko Petric committed
  def keepAllParticles(self, val):
    self._keepAllParticles = val

  @property
Marko Petric's avatar
Marko Petric committed
  def printStartTracking(self):
    """ Printout at Start of Tracking """
    return self._printStartTracking
Marko Petric's avatar
Marko Petric committed

  @printStartTracking.setter
Marko Petric's avatar
Marko Petric committed
  def printStartTracking(self, val):
    self._printEndTracking = val

  @property
Marko Petric's avatar
Marko Petric committed
  def printEndTracking(self):
    """ Printout at End of Tracking """
    return self._printEndTracking
Marko Petric's avatar
Marko Petric committed

  @printEndTracking.setter
Marko Petric's avatar
Marko Petric committed
  def printEndTracking(self, val):
    self._printEndTracking = val
Marko Petric's avatar
Marko Petric committed
  def setDumpDetailedParticleInfo(self, kernel, DDG4):
Marko Petric's avatar
Marko Petric committed
    # ---- debug code from Markus for detailed dumps of hits and MC-truth assignement ------
    # Add the particle dumper to associate the MC truth
Marko Petric's avatar
Marko Petric committed
    evt = DDG4.EventAction(kernel, "Geant4ParticleDumpAction/ParticleDump")
    kernel.eventAction().adopt(evt)
    evt.enableUI()
    # Add the hit dumper BEFORE any hit truth is fixed
Marko Petric's avatar
Marko Petric committed
    evt = DDG4.EventAction(kernel, "Geant4HitDumpAction/RawDump")
    kernel.eventAction().adopt(evt)
    evt.enableUI()
    # Add the hit dumper to the event action sequence
Marko Petric's avatar
Marko Petric committed
    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
Marko Petric's avatar
Marko Petric committed
    evt = DDG4.EventAction(kernel, "Geant4HitDumpAction/HitDump")
    kernel.eventAction().adopt(evt)
    evt.enableUI()
  def setupUserParticleHandler(self, part, kernel, DDG4):
    """Create the UserParticleHandler and configure it.

    FIXME: this is not extensible at the moment
    """
    if not self.userParticleHandler:
      return

    if self.userParticleHandler not in ["Geant4TCUserParticleHandler"]:
      logger.error("unknown UserParticleHandler: %r" % self.userParticleHandler)
    if self.userParticleHandler == "Geant4TCUserParticleHandler":
Marko Petric's avatar
Marko Petric committed
      user = DDG4.Action(kernel, "%s/UserParticleHandler" % self.userParticleHandler)
      try:
        user.TrackingVolume_Zmax = DDG4.tracker_region_zmax
        user.TrackingVolume_Rmax = DDG4.tracker_region_rmax
      except AttributeError as e:
        logger.error("Attribute of tracker region missing in detector model %s", e)
        logger.error("   make sure to specify the global constants tracker_region_zmax and tracker_region_rmax ")
        logger.error("   this is needed for the MC-truth link of created sim-hits  !  ")
        logger.error(" Or Disable the User Particle Handler with --part.userParticleHandler=''")

      try:
        user.TrackingVolume_Zmin = DDG4.tracker_region_zmin
      except AttributeError as e:
        logger.debug("Attribute tracker_region_zmin for asymmetric tracker region missing %s", e)
        logger.debug("  will use symmetric region defined by tracker_region_zmax")
        user.TrackingVolume_Zmin = str(-float(DDG4.tracker_region_zmax))

      logger.info(" *** definition of tracker region *** ")
      logger.info("    tracker_region_zmin = %s", user.TrackingVolume_Zmin)
      logger.info("    tracker_region_zmax = %s", user.TrackingVolume_Zmax)
      logger.info("    tracker_region_rmax = %s", user.TrackingVolume_Rmax)
      logger.info(" ************************************ ")