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