From 08b218cd734133d8644e1aa5da4007a41175dc84 Mon Sep 17 00:00:00 2001
From: Andre Sailer <andre.philippe.sailer@cern.ch>
Date: Tue, 1 Dec 2015 15:55:35 +0000
Subject: [PATCH] DDSim Filters: Add possibility to use list of filters

Move applyFilter to Helper/Filter
Adapt steeringFile
---
 DDSim/DD4hepSimulation.py    | 12 ++++++------
 DDSim/Helper/ConfigHelper.py |  2 ++
 DDSim/Helper/Filter.py       | 38 +++++++++++++++++++++++++++++++++---
 3 files changed, 43 insertions(+), 9 deletions(-)

diff --git a/DDSim/DD4hepSimulation.py b/DDSim/DD4hepSimulation.py
index 5ba647818..801034188 100644
--- a/DDSim/DD4hepSimulation.py
+++ b/DDSim/DD4hepSimulation.py
@@ -378,9 +378,12 @@ class DD4hepSimulation(object):
 
     #=================================================================================
 
-
     # Setup global filters for use in sensitive detectors
-    self.filter.setupFilters( kernel )
+    try:
+      self.filter.setupFilters( kernel )
+    except RuntimeError as e:
+      print "ERROR",str(e)
+      exit(1)
 
     #=================================================================================
     # get lists of trackers and calorimeters in lcdd
@@ -592,10 +595,7 @@ class DD4hepSimulation(object):
           seq,act = setupFuction( det, type=action )
       else:
         seq,act = setupFuction( det )
-      for pattern, filt in self.filter.mapDetFilter.iteritems():
-        if pattern.lower() in det.lower():
-          print "Adding filter '%s' matched with '%s' to sensitive detector for '%s' " %( filt, pattern, det )
-          seq.add( self.filter.filters[filt]['filter'] )
+      self.filter.applyFilters( seq, det )
       ##set detailed hit creation mode for this
       if self.enableDetailedShowerMode:
         act.HitCreationMode = 2
diff --git a/DDSim/Helper/ConfigHelper.py b/DDSim/Helper/ConfigHelper.py
index 644946012..aba55a166 100644
--- a/DDSim/Helper/ConfigHelper.py
+++ b/DDSim/Helper/ConfigHelper.py
@@ -45,6 +45,8 @@ class ConfigHelper( object ):
   @staticmethod
   def makeList( stringVal, sep=" "):
     """returns a list from a string separated by sep"""
+    if stringVal is None:
+      return []
     if isinstance( stringVal, list ):
       return stringVal
     else:
diff --git a/DDSim/Helper/Filter.py b/DDSim/Helper/Filter.py
index 6846fa654..c4e564ae4 100644
--- a/DDSim/Helper/Filter.py
+++ b/DDSim/Helper/Filter.py
@@ -82,8 +82,9 @@ class Filter( ConfigHelper ):
     for index in xrange(0,len(vals),2):
       self._mapDetFilter[vals[index]] = vals[index+1]
 
-    self._mapDetFilter = val
-
+  def resetFilter( self ):
+    """ remove all filters """
+    self._filters = {}
 
   def _createDefaultFilters( self ):
     """ create the map with the default filters """
@@ -94,13 +95,44 @@ class Filter( ConfigHelper ):
                                      parameter={"Cut": 1.0*keV} )
 
 
+  def __makeMapDetList( self ):
+    """ create the values of the mapDetFilters a list of filters """
+    for pattern, filters in self._mapDetFilter.iteritems():
+      self._mapDetFilter[pattern] = ConfigHelper.makeList(filters)
+
+
   def setupFilters( self, kernel):
     """ attach all filters to the kernel """
     import DDG4
+    setOfFilters = set()
 
-    for _pattern, filt in self.filters.iteritems():
+    for name, filt in self.filters.iteritems():
+      setOfFilters.add(name)
       ddFilt = DDG4.Filter(kernel,filt['name'])
       for para, value in filt['parameter'].iteritems():
         setattr( ddFilt, para, value )
       kernel.registerGlobalFilter(ddFilt)
       filt['filter'] = ddFilt
+
+    from itertools import chain
+    listOfFilters = []
+    for val in self.mapDetFilter.values():
+      listOfFilters += ConfigHelper.makeList(val)
+    requestedFilter = set(chain( ConfigHelper.makeList(self.tracker), ConfigHelper.makeList(self.calo), listOfFilters))
+    print "ReqFilt",requestedFilter
+    if requestedFilter - setOfFilters:
+      raise RuntimeError(" Filter(s) '%s' are not registered!" %  str(requestedFilter - setOfFilters) )
+
+  def applyFilters( self, seq, det ):
+    """apply the filters to to the sensitive detector
+
+    :param seq: sequence object returned when creating sensitive detector
+    :param det: sensitive detector name
+    :returns: None
+    """
+    self.__makeMapDetList()
+    for pattern, filts in self.mapDetFilter.iteritems():
+      if pattern.lower() in det.lower():
+        for filt in filts:
+          print "Adding filter '%s' matched with '%s' to sensitive detector for '%s' " %( filt, pattern, det )
+          seq.add( self.filters[filt]['filter'] )
-- 
GitLab