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