From 56f16c7edff33b70c086fcfafa4f199047ab8112 Mon Sep 17 00:00:00 2001
From: Francesca Pastore <francesca.pastore@cern.ch>
Date: Wed, 9 Jan 2019 19:03:47 +0100
Subject: [PATCH] cleanup for simplification of decision naming

---
 .../python/HLTMenuConfig/Menu/HLTCFConfig.py  | 83 +++++------------
 .../python/HLTMenuConfig/Menu/HLTCFDot.py     |  8 +-
 .../HLTMenuConfig/Menu/MenuComponents.py      | 92 +++++++------------
 .../Menu/MenuComponentsNaming.py              | 44 +++++++++
 4 files changed, 101 insertions(+), 126 deletions(-)
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponentsNaming.py

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py
index c8d1b00822c5..f1f6285a0a9e 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py
@@ -5,6 +5,7 @@ from AthenaCommon.CFElements import parOR, seqAND, seqOR
 from AthenaCommon.Logging import logging
 from AthenaCommon.AlgSequence import dumpSequence
 from TriggerMenuMT.HLTMenuConfig.Menu.HLTCFDot import  stepCF_DataFlow_to_dot, stepCF_ControlFlow_to_dot, all_DataFlow_to_dot
+from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponentsNaming import *
 
 import sys
 import copy
@@ -12,17 +13,13 @@ from AthenaCommon.Constants import VERBOSE,INFO,DEBUG
 log = logging.getLogger('HLTCFConfig')
 log.setLevel( VERBOSE )
 
-RECO_POSTFIX = "_reco"
-VIEW_POSTFIX = "_view"
-FILTER_POSTFIX = "_filter"
 
 #### Here functions to create the CF tree from CF configuration objects
 def makeSummary(name, flatDecisions):
     """ Returns a TriggerSummaryAlg connected to given decisions"""
     from DecisionHandling.DecisionHandlingConf import TriggerSummaryAlg
     summary = TriggerSummaryAlg( name, OutputLevel = 2 )
-    summary.InputDecision = "L1DecoderSummary"
-  
+    summary.InputDecision = "L1DecoderSummary"  
     summary.FinalDecisions = flatDecisions
     return summary
 
@@ -74,28 +71,15 @@ def createStepFilterNode(name, seq_list, dump=False):
     return stepCF
 
 
-# TODO not used, may be removed
-def createStepSequence(name, filterAlg, rest,sublist):
-    """ elementary HLT step sequencer, filterAlg is gating, rest is anything that needs to happe within the step """
-    
-    toadd = rest
-    for k, v in sublist.iteritems():
-        seq = seqAND(k, v)
-        toadd.append(seq)        
-    stepReco = parOR(name + RECO_POSTFIX, toadd)
-    stepAnd = seqAND(name, [ filterAlg, stepReco ])
-    return stepAnd
-
-
 def createCFTree(CFseq):
     """ Creates AthSequencer nodes with sequences attached """
 
-    log.debug(" *** Create CF Tree for CFSequence %s", CFseq.name)
+    log.debug(" *** Create CF Tree for CFSequence %s", CFseq.step.name)
 
     filterAlg = CFseq.filter.Alg
-    stepReco = parOR(CFseq.name + RECO_POSTFIX)  # all reco algoritms from al lthe sequences in a parallel sequence
-    seqAndView = seqAND(CFseq.name + VIEW_POSTFIX, [stepReco])  # include in seq:And to run in views: add here the Hypo
-    seqAndWithFilter = seqAND(CFseq.name, [filterAlg, seqAndView])  # add to the main step+filter
+    stepReco = parOR(CFseq.step.name + RECO_POSTFIX)  # all reco algoritms from al lthe sequences in a parallel sequence
+    seqAndView = seqAND(CFseq.step.name + VIEW_POSTFIX, [stepReco])  # include in seq:And to run in views: add here the Hypo
+    seqAndWithFilter = seqAND(CFseq.step.name, [filterAlg, seqAndView])  # add to the main step+filter
 
     already_connected = []
     for menuseq in CFseq.step.sequences:
@@ -113,17 +97,7 @@ def createCFTree(CFseq):
 
     return seqAndWithFilter
 
-# TODO unused, may be removed
-def addChainToHypoAlg(hypoAlg, chain):
-    """ Tmp functions for Combo Hypo """
-    if "Comb" in hypoAlg.Alg.name():
-        prop="Chains"
-        cval = hypoAlg.Alg.getProperties()[prop]
-        try:
-            cval.append(chain)
-            setattr(hypoAlg.Alg, prop, cval)
-        except:
-            pass
+
 
 #######################################
 ## CORE of Decision Handling
@@ -189,9 +163,9 @@ def matrixDisplay( allSeq ):
     mx = defaultdict(lambda: dict())
     for stepNumber,step in enumerate(allSeq, 1):
         for seq in step:
-            mx[stepNumber][seq.name] = seq
+            mx[stepNumber][seq.step.name] = seq
             
-            longestName = max(longestName, len(seq.name) )
+            longestName = max(longestName, len(seq.step.name) )
             
     longestName = longestName + 1
     def __getHyposOfStep( s ):
@@ -244,7 +218,7 @@ def decisionTree_From_Chains(HLTNode, chains):
 
     for nstep in range(0, NSTEPS):
         finalDecisions.append([]) # list of final deciisons per step
-        stepCF_name =  "Step%i"%(nstep+1)
+        stepCF_name =  StepName(nstep)
         CFseq_list = []
         step_decisions = []
 
@@ -263,27 +237,19 @@ def decisionTree_From_Chains(HLTNode, chains):
             if nstep == 0: # L1 seeding
                 seeds = chain.group_seed
                 filter_input.extend( seeds )
-
                 log.debug("Found these seeds from the chain: %s", seeds)
                 log.debug("Seeds added; having in the filter now: %s", filter_input)
-                previous_seeds=seeds  
-                                      
             else:
                 prev = chain.steps[nstep-1].sequences
-                previous_seeds=[]
                 for seq in prev:
                     filter_input.extend(seq.outputs)
-                    previous_seeds.append(seq.seed)
                 log.debug("Connect to previous sequence through these filter inputs: %s" %str( filter_input) )
-                if len(filter_input) != len(previous_seeds):
-                    log.warning("found %d filter inputs and %d seeds", len(filter_input), len(previous_seeds))
 
             # get the filter:
-            filter_name = "Filter_%s" % chain_step.name
-
+            filter_name = FilterName(chain_step.name)
             (foundFilter, sfilter) = findFilter(filter_name, CFseq_list)
             if not foundFilter:           
-                sfilter = buildFilter(filter_name, chain, filter_input, previous_seeds)
+                sfilter = buildFilter(filter_name, filter_input)
                 CF_seq = CFSequence( ChainStep=chain_step, FilterAlg=sfilter)
                 CFseq_list.append(CF_seq)
                 for sequence in chain_step.sequences:                
@@ -306,24 +272,26 @@ def decisionTree_From_Chains(HLTNode, chains):
                 
         #end of loop over chains for this step, now implement CF:
     
-        log.debug("\n******** Create CF Tree %s with AthSequencers", stepCF_name)        
+        log.debug("\n******** Create CF Tree %s with AthSequencers", stepCF_name)
+        
         #first make the filter step
         stepFilter = createStepFilterNode(stepCF_name, CFseq_list, dump=False)
         HLTNode += stepFilter
         allSeq_list.append(CFseq_list)
 
         # then the reco step
-        stepCF = createStepRecoNode("%s_%s"%(HLTNodeName,stepCF_name), CFseq_list, dump=False)
+        recoNodeName = StepRecoNodeName(HLTNodeName, stepCF_name)
+        stepCF = createStepRecoNode(recoNodeName, CFseq_list, dump=False)
         HLTNode += stepCF
 
 
         # then the monitor summary
-        summary=makeSummary("TriggerSummary"+ stepCF_name, step_decisions)
+        summary=makeSummary(StepSummaryName(stepCF_name), step_decisions)
         HLTNode += summary
 
 
         log.debug("Now Draw...")
-        stepCF_DataFlow_to_dot("%s_%s"%(HLTNodeName,stepCF_name), CFseq_list)
+        stepCF_DataFlow_to_dot(recoNodeName, CFseq_list)
         stepCF_ControlFlow_to_dot(stepCF)
 
         log.info("************* End of step %d, %s", nstep+1, stepCF_name)
@@ -373,18 +341,16 @@ def generateDecisionTree(HLTNode, chains):
 
             if nstep == 0:
                 filter_input = firstChain.group_seed
-                previous_seeds = firstChain.group_seed
+#                previous_seeds = firstChain.group_seed
 
             else:
                 filter_input = []
-                previous_seeds = []
                 for sequence in firstChain.steps[nstep - 1].sequences:
                     filter_input += sequence.outputs
-                    previous_seeds.append(sequence.seed)
 
             # One aggregated filter per chain (one per column in matrix)
             filterName = 'Filter_{}'.format( firstChain.steps[nstep].name )
-            sfilter = buildFilter(filterName, None, filter_input, previous_seeds)
+            sfilter = buildFilter(filterName,  filter_input)
 
             chainStep = firstChain.steps[nstep]
             CFseq = CFSequence( ChainStep=chainStep, FilterAlg=sfilter )
@@ -433,7 +399,7 @@ def findFilter(filter_name, cfseqList):
 
 
 
-def buildFilter(filter_name, chain, filter_input, previous_seeds):
+def buildFilter(filter_name,  filter_input):
     """
      Build the FILTER
      one filter per previous sequence at the start of the sequence: check if it exists or create a new one        
@@ -442,18 +408,13 @@ def buildFilter(filter_name, chain, filter_input, previous_seeds):
     """
     from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import  RoRSequenceFilterNode       
     sfilter = RoRSequenceFilterNode(name=filter_name)
-    for i in previous_seeds: sfilter.addSeed(i)
     for i in filter_input: sfilter.addInput(i)
+    for i in filter_input: sfilter.addOutput(FilterOutName(filter_name, i))
         
-    filter_out = ["%s_from_%s"%(filter_name,i) for i in filter_input]
-    for o in filter_out: sfilter.addOutput(o)            
-#    sfilter.setChains(chain.name)    
     log.debug("Added inputs to filter: %s", sfilter.getInputList())
     log.debug("Added outputs to filter: %s", sfilter.getOutputList())
-    log.debug("Added seeds to filter: %s", sfilter.seeds)
     log.debug("Filter Done: %s", sfilter.Alg.name())
 
-
     return (sfilter)
 
 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py
index 7ec27941cb7f..1393617f6af5 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py
@@ -86,12 +86,12 @@ def all_DataFlow_to_dot(name, step_list):
 #                print cfseq.name
                 file.write("  %s[fillcolor=%s style=filled]\n"%(cfseq.filter.Alg.name(),algColor(cfseq.filter.Alg)))            
                 step_connections.append(cfseq.filter)                      
-                file.write(  '\n  subgraph cluster_%s {\n'%(cfseq.name)\
+                file.write(  '\n  subgraph cluster_%s {\n'%(cfseq.step.name)\
                             +'     node [color=white style=filled]\n'\
                             +'     style=filled\n'\
                             +'     color=lightgrey\n'\
                             +'     fontname=Helvetica\n'\
-                            +'     label = %s\n'%(cfseq.name))
+                            +'     label = %s\n'%(cfseq.step.name))
 
                 cfseq_algs = []
                 cfseq_algs.append(cfseq.filter)
@@ -147,12 +147,12 @@ def stepCF_DataFlow_to_dot(name, cfseq_list):
             for inp in cfseq.filter.getInputList():
                 file.write(addConnection(name, cfseq.filter.Alg.name(), inp))
 
-            file.write(  '\n  subgraph cluster_%s {\n'%(cfseq.name)\
+            file.write(  '\n  subgraph cluster_%s {\n'%(cfseq.step.name)\
                         +'     node [color=white style=filled]\n'\
                         +'     style=filled\n'\
                         +'     color=lightgrey\n'\
                         +'     fontname=Helvetica\n'\
-                        +'     label = %s\n'%(cfseq.name))
+                        +'     label = %s\n'%(cfseq.step.name))
 
             cfseq_algs = []
             cfseq_algs.append(cfseq.filter)
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
index 9ae3e8efcff3..9752808d2752 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
@@ -6,13 +6,13 @@ log.setLevel( VERBOSE )
 logLevel=DEBUG
 
 from DecisionHandling.DecisionHandlingConf import RoRSeqFilter
+from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponentsNaming import *
 
 class Node():
     """ base class representing one Alg + inputs + outputs, to be used to Draw dot diagrams and connect objects"""
     def __init__(self, Alg):
         self.name = ("%sNode")%( Alg.name())
         self.Alg=Alg
-#        self.algname = Alg.name()
         self.inputs=[]
         self.outputs=[]
         
@@ -169,7 +169,6 @@ class SequenceFilterNode(AlgNode):
     """Node for any kind of sequence filter"""
     def __init__(self, Alg, inputProp, outputProp):
         AlgNode.__init__(self,  Alg, inputProp, outputProp)
-        self.seeds = []
               
     def setChains(self, name):
         log.debug("Adding Chain %s to filter %s"%(name, self.Alg.name()))
@@ -178,15 +177,8 @@ class SequenceFilterNode(AlgNode):
     def getChains(self):
         return self.getPar("Chains")
 
-    def addSeed(self, seed):
-        self.seeds.append(seed)
-
-
-    
     def __str__(self):
-        return "SequenceFilter::%s  [%s] -> [%s], seeds=[%s], chains=%s"%(self.Alg.name(),' '.join(map(str, self.getInputList())),' '.join(map(str, self.getOutputList())), ' '.join(map(str, self.seeds)), self.getChains()) 
-
-
+        return "SequenceFilter::%s  [%s] -> [%s], chains=%s"%(self.Alg.name(),' '.join(map(str, self.getInputList())),' '.join(map(str, self.getOutputList())), self.getChains())
 
 
 class RoRSequenceFilterNode(SequenceFilterNode):
@@ -290,12 +282,12 @@ class WrappedList:
 # NOW sequences and chains
 ##########################################################
 
-        
+       
 class MenuSequence():
     """ Class to group reco sequences with the Hypo"""
     def __init__(self, Sequence, Maker,  Hypo, HypoToolGen ):
         from AthenaCommon.AlgSequence import AthSequencer
-        self.name = "S_%s"%(Hypo.name()) # sequence name is based on hypo name
+        self.name = MenuSequenceName(Hypo.name())
         self.sequence     = Node( Alg=Sequence)
         self.maker        = InputMakerNode( Alg = Maker )
         self.hypoToolConf = HypoToolConf( HypoToolGen )
@@ -309,38 +301,31 @@ class MenuSequence():
         log.debug("set new Hypo %s for combo sequence %s "%(HypoAlg.name(), self.name))
         self.hypo= HypoAlgNode( Alg=HypoAlg )
     
-    def connectToFilter(self, sfilter, line):
+    def connectToFilter(self, sfilter, outfilter):
         """ Sets the input and output of the hypo, and links to the input maker """
-        splitLine = filter( lambda x: not ( x == "from" or x == "Filter"), line.split("_") ) # eliminate common words
-        splitLine =[ k[0] for k in filter( lambda x: not ( "Step" in x[0] or "Step" in x[1]), zip(splitLine, [""]+splitLine) )] # eliminate the word contaning Step and the one after
 
-        
-        #new_output = "%s_from_%s"%(self.hypo.Alg.name(), line)
-        #new_output = self.hypo.Alg.name()+"_decisions"
-        new_output = self.hypo.Alg.name() + "_" +"_".join(splitLine)
-        
-        print "Hypo ", self.hypo.Alg.name(), "output", new_output
-        self.hypo.addOutput(new_output)
-#        print self.hypo.readOutputList()
-#        print self.hypo.outputs
-        self.outputs.append(new_output)
-
-        #### Connect the InputMaker
-        self.maker.addInput(line)       
-        self.inputs.append(line)
-        
-        input_maker_output="%s_from_%s"%(self.maker.Alg.name(),line)
-        #input_maker_output=self.maker.Alg.name()+"_output"
-        self.maker.addOutput(input_maker_output) 
-        self.hypo.setPreviousDecision(input_maker_output)
-        log.debug("MenuSequence.connectToFilter: connecting InputMaker and HypoAlg, adding: \
-        InputMaker::%s.output=%s, \
-        HypoAlg::%s.previousDecision=%s, \
+        #### Connect filter to the InputMaker
+        self.maker.addInput(outfilter)       
+        input_maker_output = InputMakerOutName(self.maker.Alg.name(),outfilter)
+        self.maker.addOutput(input_maker_output)       
+
+        #### Add input/output Decision to Hypo
+        self.hypo.setPreviousDecision( input_maker_output)
+        hypo_output = HypoAlgOutName(self.hypo.Alg.name(), input_maker_output)
+        self.hypo.addOutput(hypo_output)
+
+        # needed for drawing
+        self.inputs.append(outfilter)
+        self.outputs.append(hypo_output)
+
+       
+        log.debug("MenuSequence.connectToFilter: connecting InputMaker and HypoAlg, adding: \n\
+        InputMaker::%s.output=%s, \n\
+        HypoAlg::%s.previousDecision=%s, \n\
         HypoAlg::%s.output=%s",\
-                  self.maker.Alg.name(), input_maker_output, self.hypo.Alg.name(), input_maker_output, self.hypo.Alg.name(), new_output )
+                self.maker.Alg.name(), input_maker_output, self.hypo.Alg.name(), input_maker_output, self.hypo.Alg.name(), hypo_output )
         
     def __str__(self):
-        #return "MenuSequence::%s \n Hypo::%s \n Maker::%s \n Sequence::%s"%(self.name, self.hypo, self.maker, self.sequence, new_output)
         return "MenuSequence::%s \n Hypo::%s \n Maker::%s \n Sequence::%s"%(self.name, self.hypo, self.maker, self.sequence)
 
     
@@ -411,7 +396,6 @@ class CFSequence():
    
     """
     def __init__(self, ChainStep, FilterAlg):
-        self.name = ChainStep.name   # not needed?     
         self.filter = FilterAlg
         self.step = ChainStep
         self.connect()
@@ -434,17 +418,9 @@ class CFSequence():
         
         nseq=0
         for seq in self.step.sequences:
-            #check that they have the same SEED
-            if seq.seed != self.filter.seeds[nseq]:
-                sys.exit("ERROR: sequence and filteroutput have different seeds:  %s  %s"%(seq.seed, self.filter.seeds[nseq]))
-            
-            if seq.seed not in self.filter.seeds:
-                sys.exit("ERROR: not seed %s found in Filter %s"%(seq.seed, self.filter.name))
-
-            line = filter_output[nseq]
-            log.debug("Found input %s to sequence::%s from Filter::%s (from seed %s)", line, seq.name, self.filter.Alg.name(), seq.seed)
-
-            seq.connectToFilter(self.filter, line )
+            filter_out = filter_output[nseq]
+            log.debug("Found input %s to sequence::%s from Filter::%s (from seed %s)", filter_out, seq.name, self.filter.Alg.name(), seq.seed)
+            seq.connectToFilter(self.filter, filter_out )
             nseq+=1
             
 
@@ -482,17 +458,11 @@ class ChainStep:
         if self.isCombo:            
             self.makeCombo(Sequences)
         else:
-            self.sequences = Sequences
-        
-    def replaceSequence(self, old, new):
-        # maybe obsolete?
-        idx=self.sequences.index(old) # this raise exception
-        self.sequences.pop(idx)
-        self.sequences.insert(idx, new)
+            self.sequences = Sequences          
 
     def makeCombo(self, Sequences):        
         # For combo sequences, duplicate the sequence, the Hypo with differnt names and create the ComboHypoAlg
-        self.combo = ComboMaker("ComboHypo_%s"%self.name)
+        self.combo = ComboMaker(ComboHypoName(self.name))
         duplicatedHypos = []
         for sequence in Sequences:         
             oldhypo=sequence.hypo.Alg
@@ -500,9 +470,9 @@ class ChainStep:
             ncopy=duplicatedHypos.count(oldhypo.name())
                
             new_sequence=copy.deepcopy(sequence)
-            new_sequence.name="%s%d_for_%s"%(sequence.name,ncopy, self.name)            
+            new_sequence.name = ComboSequenceCopyName(sequence.name,ncopy, self.name)
             
-            newHypoAlgName = "%s%d_for_%s"%(oldhypo.name(),ncopy, self.name)            
+            newHypoAlgName = ComboHypoCopyName(oldhypo.name(),ncopy, self.name)
             new_hypoAlg=oldhypo.clone(newHypoAlgName)
             new_sequence.replaceHypoForCombo(new_hypoAlg)
             self.sequences.append(new_sequence)            
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponentsNaming.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponentsNaming.py
new file mode 100644
index 000000000000..58106680a4bd
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponentsNaming.py
@@ -0,0 +1,44 @@
+RECO_POSTFIX = "_reco"
+VIEW_POSTFIX = "_view"
+FILTER_POSTFIX = "_filter"
+
+
+def ReduceName(line):
+    splitLine = filter( lambda x: not ( x == "from" or x == "Filter"), line.split("_") ) # eliminate common words
+    splitLine =[ k[0] for k in filter( lambda x: not ( "Step" in x[0] or "Step" in x[1]), zip(splitLine, [""]+splitLine) )] # eliminate the word contaning Step and the one after 
+    return "_".join(splitLine)
+
+
+def StepName(nstep):
+    return "Step%i"%(nstep+1)
+
+def MenuSequenceName(Hypo):
+    return ("S_" + Hypo)
+
+def FilterName(ChainStepName):
+    return ("Filter_" + ChainStepName)
+
+def FilterOutName(filter_name, filterIn):
+    return (filter_name + "_from_" + filterIn)
+
+def InputMakerOutName(IMname, filterOut):
+    return "%s_from_%s"%(IMname, filterOut)
+#    return  (IMname + "_" + ReduceName(filterOut))
+
+def HypoAlgOutName(HypoName, HypoInput):
+    return  (HypoName + "_" + ReduceName(HypoInput))
+
+def ComboHypoName(HypoName):
+    return ("ComboHypo_" + HypoName)
+
+def ComboSequenceCopyName(SequenceName, ncopy, StepName):    
+    return "%s%d_for_%s"%(SequenceName, ncopy, StepName)
+
+def ComboHypoCopyName(HypoName,ncopy,StepName):
+    return "%s%d_for_%s"%(HypoName,ncopy,StepName)
+
+def StepRecoNodeName(HLTNodeName, stepCF_name):
+    return  (HLTNodeName + "_" + stepCF_name)
+
+def StepSummaryName(stepCF_name):
+    return ("TriggerSummary"+ stepCF_name)
-- 
GitLab