From 5c4a2727c59a0936023fafcde1186ae817338874 Mon Sep 17 00:00:00 2001
From: Andre Sailer <andre.philippe.sailer@cern.ch>
Date: Wed, 2 Dec 2015 14:19:14 +0000
Subject: [PATCH] DDSim:Filter: Add handling of default filters

if not specific filter is set the default filter for tracker or calorimeter is applied (if a default filter is set)
To turn off all filters just assign an empty string, empty list or None to the mapDetFilter

update doc
---
 DDSim/DD4hepSimulation.py    |  8 ++++----
 DDSim/Helper/ConfigHelper.py |  2 +-
 DDSim/Helper/Filter.py       | 14 +++++++++++---
 3 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/DDSim/DD4hepSimulation.py b/DDSim/DD4hepSimulation.py
index a296135ed..720e978bb 100644
--- a/DDSim/DD4hepSimulation.py
+++ b/DDSim/DD4hepSimulation.py
@@ -391,14 +391,14 @@ class DD4hepSimulation(object):
 
     # ---- add the trackers:
     try:
-      self.__setupSensitiveDetectors( trk, simple.setupTracker)
+      self.__setupSensitiveDetectors( trk, simple.setupTracker, self.filter.tracker)
     except Exception as e:
       print "ERROR setting up sensitive detector", str(e)
       raise
 
   # ---- add the calorimeters:
     try:
-      self.__setupSensitiveDetectors( cal, simple.setupCalorimeter )
+      self.__setupSensitiveDetectors( cal, simple.setupCalorimeter, self.filter.calo )
     except Exception as e:
       print "ERROR setting up sensitive detector", str(e)
       raise
@@ -569,7 +569,7 @@ class DD4hepSimulation(object):
 
     return runHeader
 
-  def __setupSensitiveDetectors(self, detectors, setupFuction):
+  def __setupSensitiveDetectors(self, detectors, setupFuction, defaultFilter=None):
     """ attach sensitive detector actions for all subdetectors
     can be steered with the `Action` ConfigHelpers
 
@@ -594,7 +594,7 @@ class DD4hepSimulation(object):
           seq,act = setupFuction( det, type=action )
       else:
         seq,act = setupFuction( det )
-      self.filter.applyFilters( seq, det )
+      self.filter.applyFilters( seq, det, defaultFilter )
       ##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 aba55a166..03a27801b 100644
--- a/DDSim/Helper/ConfigHelper.py
+++ b/DDSim/Helper/ConfigHelper.py
@@ -45,7 +45,7 @@ class ConfigHelper( object ):
   @staticmethod
   def makeList( stringVal, sep=" "):
     """returns a list from a string separated by sep"""
-    if stringVal is None:
+    if not stringVal:
       return []
     if isinstance( stringVal, list ):
       return stringVal
diff --git a/DDSim/Helper/Filter.py b/DDSim/Helper/Filter.py
index c4e564ae4..ea910c8e3 100644
--- a/DDSim/Helper/Filter.py
+++ b/DDSim/Helper/Filter.py
@@ -21,6 +21,9 @@ class Filter( ConfigHelper ):
   Or more than one filter:
   >>> SIM.filter.mapDetFilter['FTD'] = ["edep1kev", "geantino"]
 
+  Don't use the default filter or anything else:
+  >>> SIM.filter.mapDetFilter['TPC'] = None ## or "" or []
+
   Create a custom filter. The dictionary is used to instantiate the filter later on
   >>> SIM.filter.filters['edep3kev'] = dict(name="EnergyDepositMinimumCut/3keV", parameter={"Cut": 3.0*keV} )
 
@@ -35,7 +38,7 @@ class Filter( ConfigHelper ):
 
   @property
   def tracker( self ):
-    """ default filter for tracking sensitive detectors """
+    """ default filter for tracking sensitive detectors; this is applied if no other filter is used for a tracker"""
     return self._tracker
   @tracker.setter
   def tracker( self, val ):
@@ -43,7 +46,7 @@ class Filter( ConfigHelper ):
 
   @property
   def calo( self ):
-    """ default filter for calorimeter sensitive detectors """
+    """ default filter for calorimeter sensitive detectors; this is applied if no other filter is used for a calorimeter """
     return self._calo
   @calo.setter
   def calo( self, val ):
@@ -123,7 +126,7 @@ class Filter( ConfigHelper ):
     if requestedFilter - setOfFilters:
       raise RuntimeError(" Filter(s) '%s' are not registered!" %  str(requestedFilter - setOfFilters) )
 
-  def applyFilters( self, seq, det ):
+  def applyFilters( self, seq, det, defaultFilter=None):
     """apply the filters to to the sensitive detector
 
     :param seq: sequence object returned when creating sensitive detector
@@ -131,8 +134,13 @@ class Filter( ConfigHelper ):
     :returns: None
     """
     self.__makeMapDetList()
+    foundFilter=False
     for pattern, filts in self.mapDetFilter.iteritems():
       if pattern.lower() in det.lower():
+        foundFilter = True
         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'] )
+
+    if not foundFilter and defaultFilter:
+      seq.add( self.filters[defaultFilter]['filter'] )
-- 
GitLab