diff --git a/Trigger/TrigSteer/L1Decoder/src/RoIsUnpackingEmulationTool.cxx b/Trigger/TrigSteer/L1Decoder/src/RoIsUnpackingEmulationTool.cxx index 67fade26f66d10ef352d69c34596652666af1bc9..3755b1dac47ae927a6a222fd5cfa8e9aa1895edc 100644 --- a/Trigger/TrigSteer/L1Decoder/src/RoIsUnpackingEmulationTool.cxx +++ b/Trigger/TrigSteer/L1Decoder/src/RoIsUnpackingEmulationTool.cxx @@ -62,7 +62,10 @@ StatusCode RoIsUnpackingEmulationTool::decodeThresholdToChainMapping() { ATH_MSG_WARNING( "No chains configured in ThresholdToChainMapping: " << m_thresholdToChainProperty ); } for ( auto el: m_thresholdToChainMapping ) { - ATH_MSG_DEBUG( "Threshold " << el.first << " mapped to chains " << el.second ); + ATH_MSG_DEBUG( "Threshold " << el.first << " mapped to chains "); + for (auto id: el.second){ + ATH_MSG_DEBUG(" "<<id.name()); + } } diff --git a/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureConfig.py b/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureConfig.py index 120ea01fe8060ed8c5b4cce723f92404bb8040f0..4504157e24ff17e72abbc20b484f2fe4052eda0c 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureConfig.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureConfig.py @@ -103,6 +103,14 @@ elstep1_sequence = seqAND("elSeqStep1", [elIM, elAlg]) def elStep1Sequence(): return MenuSequence( Maker=elIM, Sequence=elstep1_sequence, Hypo=elHypo, HypoToolGen=ElTestHypoTool) + +gammHypo = ElGamHypo(name="Step1GamHypo") +gammHypo.Input = elAlg.Output + +def gammStep1Sequence(): + return MenuSequence( Maker=elIM, Sequence=elstep1_sequence, Hypo=gammHypo, HypoToolGen=GammTestHypoTool) + + #step2 elIM2= InputMakerAlg(name="Step2ElInputMaker") elIM2.Output='elIM2_out' diff --git a/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureHypoTools.py b/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureHypoTools.py index 0ff7a7c308c18ad77bde8f3bb3814b12d7195a04..a402198f5aa0a7e0cc5d225216902f67d2822a77 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureHypoTools.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureHypoTools.py @@ -18,6 +18,10 @@ def ElTestHypoTool(name,conf): threshold = conf.replace("HLT_e","") return TestHypoTool(name,prop="et", threshold_value=threshold) +def GammTestHypoTool(name,conf): + threshold = conf.replace("HLT_g","") + return TestHypoTool(name,prop="et", threshold_value=threshold) + def MuTest2HypoTool(name, conf): threshold = conf.replace("HLT_mu","") diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessing.ref b/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessing.ref index 2896b5ec9dff6793b77851d565f58e507d7153d5..c98107b15439532bfbcad474e673d252ba77be1a 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessing.ref +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessing.ref @@ -1,5 +1,8 @@ TrigSignatureMoniMT INFO HLT_e20 2 2 2 2 2 -TrigSignatureMoniMT INFO HLT_e8 2 2 2 2 2 +TrigSignatureMoniMT INFO HLT_e5 1 1 1 1 1 +TrigSignatureMoniMT INFO HLT_e5_e8 1 1 1 0 1 +TrigSignatureMoniMT INFO HLT_e8 3 3 3 3 3 +TrigSignatureMoniMT INFO HLT_g5 1 1 1 0 1 TrigSignatureMoniMT INFO HLT_mu20 1 1 0 0 0 TrigSignatureMoniMT INFO HLT_mu8 2 2 2 2 2 TrigSignatureMoniMT INFO HLT_mu81step 2 2 2 0 2 diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py b/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py index 92a543bc2fa14952d072742c2ad606112f0db64e..3e90c9a187209c941ee7ff24bff0e2a23e45813a 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py @@ -28,15 +28,12 @@ data['msmu'] = [';', 'eta:-1.2,phi:0.7,pt:6500,pt2:8500; eta:-1.1,phi:0.6,pt:8500,pt2:8500;', 'eta:-1.7,phi:-0.2,pt:9500,pt2:8500;'] -data['ctp'] = [ 'HLT_e20', - 'HLT_mu8 HLT_mu81step HLT_e20 HLT_e8 HLT_mu8_e8', +data['ctp'] = [ 'HLT_e20 HLT_e5_e8 HLT_e5 HLT_e8 HLT_g5', + 'HLT_mu8 HLT_mu81step HLT_e20 HLT_e8 HLT_mu8_e8 HLT_e3_e5', 'HLT_mu20 HLT_mu8 HLT_mu81step HLT_2mu8 HLT_e8' ] -## data['ctp'] = [ 'HLT_g100', -## 'HLT_2g50 HLT_e20', -## 'HLT_mu20 HLT_mu8 HLT_2mu8 HLT_mu8_e8' ] -data['l1emroi'] = ['1,1,0,EM3,EM7,EM15,EM20,EM50,EM100; 1,-1.2,0,EM3,EM7', +data['l1emroi'] = ['1,1,0,EM3,EM7,EM15,EM20,EM50,EM100,2EM3; 1,-1.2,0,EM3,EM7,2EM3', '-0.6,0.2,0,EM3,EM7,EM15,EM20,EM50,EM100; 1,-1.1,0,EM3,EM7,EM15,EM20,EM50', '-0.6,1.5,0,EM3,EM7,EM7'] @@ -105,12 +102,17 @@ if doMuon: ## #electron chains if doElectron: - from TrigUpgradeTest.HLTSignatureConfig import elStep1Sequence, elStep2Sequence + from TrigUpgradeTest.HLTSignatureConfig import elStep1Sequence, elStep2Sequence, gammStep1Sequence elStep1 = elStep1Sequence() elStep2 = elStep2Sequence() + + gammStep1 = gammStep1Sequence() + ElChains = [ + Chain(name='HLT_e5' , Seed="L1_EM7", ChainSteps=[ ChainStep("Step1_em", [elStep1]), ChainStep("Step2_em", [elStep2]) ] ), Chain(name='HLT_e20' , Seed="L1_EM7", ChainSteps=[ ChainStep("Step1_em", [elStep1]), ChainStep("Step2_em", [elStep2]) ] ), - Chain(name='HLT_e8' , Seed="L1_EM7", ChainSteps=[ ChainStep("Step1_em", [elStep1]), ChainStep("Step2_em", [elStep2]) ] ) + Chain(name='HLT_e8' , Seed="L1_EM7", ChainSteps=[ ChainStep("Step1_em", [elStep1]), ChainStep("Step2_em", [elStep2]) ] ), + Chain(name='HLT_g5' , Seed="L1_EM7", ChainSteps=[ ChainStep("Step1_gam", [gammStep1]) ] ) ] HLTChains += ElChains @@ -124,9 +126,11 @@ if doCombo: muStep1 = muStep1Sequence() elStep2 = elStep2Sequence() muStep2 = muStep2Sequence() - + + CombChains =[ - Chain(name='HLT_mu8_e8' , Seed="L1_MU6_EM7", ChainSteps=[ ChainStep("Step1_mu_em", [muStep1, elStep1]), ChainStep("Step2_mu_em", [muStep2, elStep2])] ) + Chain(name='HLT_mu8_e8', Seed="L1_MU6_EM7", ChainSteps=[ ChainStep("Step1_mu_em", [muStep1, elStep1]), ChainStep("Step2_mu_em", [muStep2, elStep2])] ), + Chain(name='HLT_e5_e8', Seed="L1_2EM3", ChainSteps=[ ChainStep("Step1_2em",[elStep1, elStep1]) ]) ] HLTChains += CombChains @@ -139,10 +143,10 @@ if doCombo: print "enabled Combo chains: ", EnabledMuComboChains,EnabledElComboChains -EnabledChainNamesToCTP = [str(n)+":"+c.name for n,c in enumerate(HLTChains)] +# this is a temporary hack to include new test chains +EnabledChainNamesToCTP = dict([ (c.name, c.seed) for c in HLTChains]) -print "EnabledChainNamesToCTP: ",EnabledChainNamesToCTP @@ -152,12 +156,7 @@ L1UnpackingSeq = parOR("L1UnpackingSeq") from L1Decoder.L1DecoderConf import CTPUnpackingEmulationTool, RoIsUnpackingEmulationTool, L1Decoder l1Decoder = L1Decoder( OutputLevel=DEBUG, RoIBResult="" ) l1Decoder.prescaler.EventInfo="" -l1Decoder.ChainToCTPMapping = {'HLT_mu20' : 'L1_MU8', - 'HLT_mu81step' : 'L1_MU8', - 'HLT_mu8' : 'L1_MU8', - 'HLT_e20' : 'L1_EM12', - 'HLT_e8' : 'L1_EM7', - 'HLT_mu8_e8' : 'L1_EM3_MU6'} +l1Decoder.ChainToCTPMapping = EnabledChainNamesToCTP l1Decoder.Chains="HLTChainsResult" ctpUnpacker = CTPUnpackingEmulationTool( OutputLevel = DEBUG, ForceEnableAllChains=False , InputFilename="ctp.dat" ) @@ -165,11 +164,13 @@ l1Decoder.ctpUnpacker = ctpUnpacker emUnpacker = RoIsUnpackingEmulationTool("EMRoIsUnpackingTool", OutputLevel=DEBUG, InputFilename="l1emroi.dat", OutputTrigRoIs="L1EMRoIs", Decisions="L1EM" ) emUnpacker.ThresholdToChainMapping = EnabledElChains + EnabledElComboChains +emUnpacker.Decisions="L1EM" print "EMRoIsUnpackingTool enables chians:" print emUnpacker.ThresholdToChainMapping muUnpacker = RoIsUnpackingEmulationTool("MURoIsUnpackingTool", OutputLevel=DEBUG, InputFilename="l1muroi.dat", OutputTrigRoIs="L1MURoIs", Decisions="L1MU" ) muUnpacker.ThresholdToChainMapping = EnabledMuChains + EnabledMuComboChains +muUnpacker.Decisions="L1MU" print "MURoIsUnpackingTool enables chians:" print muUnpacker.ThresholdToChainMapping @@ -195,14 +196,6 @@ print L1UnpackingSeq # filters: one SeqFilter per step, per chain # inputMakers: one per each first RecoAlg in a step (so one per step), one input per chain that needs that step -# map L1 decisions for menu -for unpack in l1Decoder.roiUnpackers: - if unpack.name() is "EMRoIsUnpackingTool": - unpack.Decisions="L1EM" - if unpack.name() is "MURoIsUnpackingTool": - unpack.Decisions="L1MU" - - from AthenaCommon.AlgSequence import AlgSequence, AthSequencer, dumpSequence topSequence = AlgSequence() diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py index cd96edbd05ae4a2e0c5b392cfd69e9cd496a0a96..ebcd21c42175472960d1c0aaaed23c7b53da6113 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py @@ -16,6 +16,7 @@ include("TrigUpgradeTest/testHLT_MT.py") ########################################## doElectron = True +doPhoton = False doMuon = True doJet = False doCombo = True @@ -29,7 +30,12 @@ EnabledElComboChains = [] testChains = [] +#common parts: +fastCaloStep=None + +################################################################## # egamma chains +################################################################## if (doElectron): from TrigUpgradeTest.electronMenuDefs import fastCaloSequence, electronSequence fastCaloStep=fastCaloSequence() @@ -46,8 +52,25 @@ if (doElectron): ] testChains += egammaChains +################################################################## +# photon chains +################################################################## +if (doPhoton): + from TrigUpgradeTest.photonMenuDefs import fastCaloSequence, photonSequence + + photonstep= photonSequence() + if fastCaloStep is None: + fastCaloStep=fastCaloSequence() + + photonChains = [ + Chain(name='HLT_g5_etcut', Seed="L1_EM3", ChainSteps=[ ChainStep("Step1_g5_etcut", [fastCaloStep]), ChainStep("Step2_g5_etcut", [photonstep])] ) + ] + + testChains += photonChains +################################################################## # muon chains +################################################################## if (doMuon): from TrigUpgradeTest.muMenuDefs import muFastStep, muCombStep, doL2SA, doL2CB, doEFSA MuonChains = [] @@ -64,7 +87,9 @@ if (doMuon): testChains += MuonChains +################################################################## # jet chains +################################################################## if (doJet): from TrigUpgradeTest.jetMenuDefs import jetSequence @@ -77,7 +102,9 @@ if (doJet): ] testChains += jetChains - +################################################################## +# combined chains +################################################################## if (doCombo): # combo chains comboChains= [] diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref index 44536af41bdd905be8095a648bbcff12f1621aab..34ebbe260050bf993ee5995036f4f07c2c142cf0 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref @@ -39,6 +39,7 @@ TriggerSummaryStep1 5 0 DEBUG +++ HLT_e3_etcut1step I TriggerSummaryStep1 5 0 DEBUG +++ HLT_mu6 ID#1672162766 TriggerSummaryStep1 5 0 DEBUG +++ HLT_e7_etcut ID#2430733989 TriggerSummaryStep1 5 0 DEBUG +++ HLT_e3_etcut ID#2711808158 +TriggerSummaryStep1 5 0 DEBUG +++ HLT_e3_etcut_mu6 ID#3189262314 TriggerSummaryStep2 5 0 DEBUG +++ HLT_mu6Comb ID#393364983 TriggerSummaryStep2 5 0 DEBUG +++ HLT_e5_etcut ID#607406625 TriggerSummaryStep2 5 0 DEBUG +++ HLT_e7_etcut ID#2430733989 @@ -125,7 +126,7 @@ TrigSignatureMoniMT INFO HLT_2mu6 TrigSignatureMoniMT INFO HLT_2mu6Comb 20 20 0 0 0 TrigSignatureMoniMT INFO HLT_e3_etcut 20 20 18 17 17 TrigSignatureMoniMT INFO HLT_e3_etcut1step 20 20 18 0 18 -TrigSignatureMoniMT INFO HLT_e3_etcut_mu6 20 20 3 0 0 +TrigSignatureMoniMT INFO HLT_e3_etcut_mu6 20 20 10 0 1 TrigSignatureMoniMT INFO HLT_e5_etcut 20 20 17 16 16 TrigSignatureMoniMT INFO HLT_e7_etcut 20 20 15 14 14 TrigSignatureMoniMT INFO HLT_mu6 20 20 3 0 3 diff --git a/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt b/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt index eb786fad010c7fcf8ae7fd7a9ff7eb3a1aa296e5..911521d6367b8c3c2f2f0c3c22b8bca1403b4180 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt +++ b/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt @@ -110,10 +110,10 @@ atlas_install_scripts( scripts/generateL1TopoMenuMT.py ) atlas_install_xmls( data/*.dtd data/*.xml ) -atlas_add_test( generateMenuMT SCRIPT scripts/testMenuMT.sh - PROPERTIES TIMEOUT 500 - POST_EXEC_SCRIPT "check_log.pl --config checklogTriggerTest.conf generateMenuMT.log" - ) +#atlas_add_test( generateMenuMT SCRIPT scripts/testMenuMT.sh +# PROPERTIES TIMEOUT 500 +# POST_EXEC_SCRIPT "check_log.pl --config checklogTriggerTest.conf generateMenuMT.log" +# ) diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py index 5f7ceaa7721e3a3066239f868e9e2ba198974837..2bacd19e84e9fd24bc24a36b8e8dfcaf811fe696 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py @@ -39,29 +39,28 @@ def makeStreamESD(name, flatDecisions): addTC( tc ) addTC("HLTSummary") - if log.isEnabledFor(logging.DEBUG): - log.debug("ESD file content: ") - log.debug( StreamESD.ItemList ) + log.debug("ESD file content: ") + log.debug( StreamESD.ItemList ) return StreamESD -def create_step_reco_node(name, seq_list, dump=False): +def createStepRecoNode(name, seq_list, dump=False): """ elementary HLT reco step, contianing all sequences of the step """ - if log.isEnabledFor(logging.DEBUG): - log.debug("Create reco step %s with %d sequences", name, len(seq_list)) + + log.debug("Create reco step %s with %d sequences", name, len(seq_list)) stepCF = parOR(name+"_reco") for seq in seq_list: - step_seq = create_CFSequence(seq) + step_seq = createCFTree(seq) stepCF += step_seq if dump: dumpSequence (stepCF, indent=0) return stepCF -def create_step_filter_node(name, seq_list, dump=False): +def createStepFilterNode(name, seq_list, dump=False): """ elementary HLT filter step: OR node containing all Filters of the sequences. The node gates execution of next reco step """ - if log.isEnabledFor(logging.DEBUG): - log.debug("Create filter step %s with %d filters", name, len(seq_list)) + + log.debug("Create filter step %s with %d filters", name, len(seq_list)) stepCF = parOR(name+"_filter") for seq in seq_list: filterAlg=seq.filter.Alg @@ -73,45 +72,48 @@ def create_step_filter_node(name, seq_list, dump=False): -def create_step_sequence(name, filterAlg, rest,sublist): +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) - + toadd.append(seq) stepReco = parOR(name+"_reco", toadd) stepAnd = seqAND(name, [ filterAlg, stepReco ]) return stepAnd -def create_CFSequence(CFseq): +def createCFTree(CFseq): """ Creates AthSequencer nodes with sequences attached """ - if log.isEnabledFor(logging.DEBUG): - log.debug(" *** Create CFSequence %s with FilterAlg %s *", CFseq.name, CFseq.filter.Alg.name()) - filterAlg=CFseq.filter.Alg - + log.debug(" *** Create CF Tree for CFSequence %s", CFseq.name) + + filterAlg=CFseq.filter.Alg stepReco = parOR(CFseq.name+"_reco") # all reco algoritms from al lthe sequences in a parallel sequence seqAndView = seqAND(CFseq.name+"_view", [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 - + + already_connected = [] for menuseq in CFseq.step.sequences: - ath_sequence=menuseq.sequence.Alg - subs = ath_sequence - stepReco += subs + ath_sequence = menuseq.sequence.Alg + name = ath_sequence.name() + if name in already_connected: + log.debug("AthSequencer %s already in the Tree, not added again",name) + else: + already_connected.append(name) + stepReco += ath_sequence seqAndView += menuseq.hypo.Alg if CFseq.step.isCombo: seqAndView += CFseq.step.combo.Alg - print CFseq.step.combo.Alg return seqAndWithFilter def addChainToHypoAlg(hypoAlg, chain): """ Tmp functions for Combo Hypo """ - if "Comb" in hypoAlg.algname: + if "Comb" in hypoAlg.Alg.name(): prop="Chains" cval = hypoAlg.Alg.getProperties()[prop] try: @@ -183,8 +185,8 @@ def makeHLTTree(HLTChains): def decisionTree_From_Chains(HLTNode, chains): """ creates the decision tree, given the starting node and the chains containing the sequences """ - if log.isEnabledFor(logging.DEBUG): - log.debug("Run decisionTree_From_Chains on %s", HLTNode.name()) + + log.debug("Run decisionTree_From_Chains on %s", HLTNode.name()) from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import CFSequence, RoRSequenceFilterNode, ComboMaker HLTNodeName= HLTNode.name() @@ -193,12 +195,12 @@ def decisionTree_From_Chains(HLTNode, chains): NSTEPS=0 for chain in chains: steps =len(chain.steps) - if log.isEnabledFor(logging.DEBUG): - log.debug("Adding chain %s with %d steps"%(chain.name,steps)) + + log.debug("Adding chain %s with %d steps"%(chain.name,steps)) if NSTEPS < steps: NSTEPS = steps - if log.isEnabledFor(logging.DEBUG): + log.debug("Run on %d steps", NSTEPS) @@ -222,23 +224,20 @@ def decisionTree_From_Chains(HLTNode, chains): chain_step=chain.steps[nstep] log.debug("\n************* Start step %d %s for chain %s", nstep+1, stepCF_name, chain.name) - # one filter per step_chain + # one filter per ChainStep - same name indeed # one filter input per previous menusequence output (the L1Seed for first step) # one filter output per menuSeq filter_input =[] if nstep == 0: # L1 seeding - previous_sequence="".join(chain.group_seed) seeds=chain.group_seed filter_input.extend( seeds ) - log.debug("Found these seeds from the sequence: %s", seeds) - log.debug("Seeds from this chain: %s", filter_input) + 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: - # from previous step, map the seuqence in the same order? - previous_sequence = chain_step.name prev=chain.steps[nstep-1].sequences previous_seeds=[] for seq in prev: @@ -250,23 +249,27 @@ def decisionTree_From_Chains(HLTNode, chains): log.error("found %d filter inputs and %d seeds", len(filter_input), len(previous_seeds)) sys.exit("ERROR, in size") - - (sfilter, alreadyFoundFilter) = buildFilter(chain_step.name, previous_sequence, CFseq_list, chain, filter_input, previous_seeds) - #(sfilter, alreadyFoundFilter) = buildFilter(stepCF_name, previous_sequence, CFseq_list, chain, filter_input, previous_seeds) - - if not alreadyFoundFilter: + + # get the filter: + filter_name="Filter_%s" % chain_step.name + + (foundFilter, sfilter) = findFilter(filter_name, CFseq_list) + if not foundFilter: + sfilter = buildFilter(filter_name, chain, filter_input, previous_seeds) CF_seq = CFSequence( ChainStep=chain_step, FilterAlg=sfilter) CFseq_list.append(CF_seq) for sequence in chain_step.sequences: - step_decisions.extend(sequence.outputs) + step_decisions.extend(sequence.outputs) + + sfilter.setChains(chain.name) + log.debug("Adding chain %s to %s", chain.name,sfilter.Alg.name()) + log.debug(sfilter.getChains()) if len(chain.steps) == nstep+1: - if log.isEnabledFor(logging.DEBUG): - log.debug("Adding finalDecisions for chain %s at step %d:"%(chain.name, nstep+1)) + log.debug("Adding finalDecisions for chain %s at step %d:"%(chain.name, nstep+1)) for seq in chain_step.sequences: finalDecisions[nstep].extend(seq.outputs) - if log.isEnabledFor(logging.DEBUG): - log.debug(seq.outputs) + log.debug(seq.outputs) #end of loop over menu sequences @@ -274,12 +277,12 @@ def decisionTree_From_Chains(HLTNode, chains): log.debug("\n******** Create CF Tree %s with AthSequencers", stepCF_name) #first make the filter step - stepFilter = create_step_filter_node(stepCF_name, CFseq_list, dump=False) + stepFilter = createStepFilterNode(stepCF_name, CFseq_list, dump=False) HLTNode += stepFilter allSeq_list.append(CFseq_list) # then the reco step - stepCF = create_step_reco_node("%s_%s"%(HLTNodeName,stepCF_name), CFseq_list, dump=False) + stepCF = createStepRecoNode("%s_%s"%(HLTNodeName,stepCF_name), CFseq_list, dump=False) HLTNode += stepCF @@ -299,48 +302,51 @@ def decisionTree_From_Chains(HLTNode, chains): log.debug("finalDecisions: %s" %str( finalDecisions) ) all_DataFlow_to_dot(HLTNodeName, allSeq_list) + return finalDecisions -## This can be simplified! -def buildFilter(stepCF_name, previous_sequence, CFseq_list, chain, filter_input, previous_seeds): +def findFilter(filter_name, cfseqList): + """ + searches for a filter, with given name, in the CF sequence list of this step + """ + log.debug( "findFilter: filter name %s" % filter_name ) + foundFilters = [cfseq.filter for cfseq in cfseqList if filter_name in cfseq.filter.Alg.name()] + if len(foundFilters) > 1: + log.error("found %d filters with name %s", len( foundFilters ), filter_name) + sys.exit("ERROR, in filter configuration") + + found = bool(foundFilters) + if found: + log.debug("Filter %s already exists", filter_name) + return (found, foundFilters[0]) + return (found, None) + + + +def buildFilter(filter_name, chain, filter_input, previous_seeds): """ Build the FILTER - one filter per previous sequence at the start of the sequence: check if it exists or create a new one if the previous hypo has more than one output, try to get all of them one filter per previous sequence: 1 input/previous seq, 1 output/next seq """ - from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import RoRSequenceFilterNode - #filter_name="Filter%s_on_%s"%( stepCF_name, previous_sequence ) - filter_name="Filter_%s" % stepCF_name - log.debug( "Trying to create filter of name %s" % filter_name ) - foundFilters = [cfseq.filter for cfseq in CFseq_list if filter_name in cfseq.filter.algname] - - if len(foundFilters) > 1: - log.error("found %d filters with name %s", len( foundFilters ), filter_name) - sys.exit("ERROR, in filter configuration") - - if foundFilters: - sfilter=foundFilters[0] - sfilter.setChains(chain.name) - log.debug("Filter %s already exists", filter_name) - log.debug("Adding chain %s to %s", chain.name,sfilter.algname) - log.debug(sfilter.getChains()) - - else: - sfilter = RoRSequenceFilterNode(name=filter_name) - for i in previous_seeds: sfilter.addSeed(i) - for i in filter_input: sfilter.addInput(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("Adding these seeds to filter: %s", previous_seeds) - log.debug("Filter Done: %s", sfilter.name) - - - return (sfilter, bool(foundFilters) ) + 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) + + 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 4ac66ce7c3f46c14e2a80316003efc594e62101a..7ec27941cb7f2c2966c4367baf240561fec9725c 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py @@ -84,7 +84,7 @@ def all_DataFlow_to_dot(name, step_list): last_step_hypoNodes =[] for cfseq in cfseq_list: # print cfseq.name - file.write(" %s[fillcolor=%s style=filled]\n"%(cfseq.filter.algname,algColor(cfseq.filter.Alg))) + 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)\ +' node [color=white style=filled]\n'\ @@ -106,17 +106,17 @@ def all_DataFlow_to_dot(name, step_list): cfseq_algs.append(menuseq.maker) cfseq_algs.append(menuseq.sequence ) if menuseq.reuse==False: - file.write(" %s[fillcolor=%s]\n"%(menuseq.maker.algname, algColor(menuseq.maker.Alg))) - file.write(" %s[fillcolor=%s]\n"%(menuseq.sequence.algname, algColor(menuseq.sequence.Alg))) + file.write(" %s[fillcolor=%s]\n"%(menuseq.maker.Alg.name(), algColor(menuseq.maker.Alg))) + file.write(" %s[fillcolor=%s]\n"%(menuseq.sequence.Alg.name(), algColor(menuseq.sequence.Alg))) menuseq.reuse=True cfseq_algs.append(menuseq.hypo) if not cfseq.step.isCombo: last_step_hypoNodes.append(menuseq.hypo) - file.write(" %s[color=%s]\n"%(menuseq.hypo.algname, algColor(menuseq.hypo.Alg))) + file.write(" %s[color=%s]\n"%(menuseq.hypo.Alg.name(), algColor(menuseq.hypo.Alg))) #combo if cfseq.step.isCombo: - file.write(" %s[color=%s]\n"%(cfseq.step.combo.algname, algColor(cfseq.step.combo.Alg))) + file.write(" %s[color=%s]\n"%(cfseq.step.combo.Alg.name(), algColor(cfseq.step.combo.Alg))) cfseq_algs.append(cfseq.step.combo) last_step_hypoNodes.append(cfseq.step.combo) file.write(' }\n') @@ -143,9 +143,9 @@ def stepCF_DataFlow_to_dot(name, cfseq_list): for cfseq in cfseq_list: # print cfseq.name - file.write(" %s[fillcolor=%s style=filled]\n"%(cfseq.filter.algname,algColor(cfseq.filter.Alg))) + file.write(" %s[fillcolor=%s style=filled]\n"%(cfseq.filter.Alg.name(),algColor(cfseq.filter.Alg))) for inp in cfseq.filter.getInputList(): - file.write(addConnection(name, cfseq.filter.algname, inp)) + file.write(addConnection(name, cfseq.filter.Alg.name(), inp)) file.write( '\n subgraph cluster_%s {\n'%(cfseq.name)\ +' node [color=white style=filled]\n'\ @@ -167,16 +167,16 @@ def stepCF_DataFlow_to_dot(name, cfseq_list): cfseq_algs.append(menuseq.maker) cfseq_algs.append(menuseq.sequence ) if menuseq.reuse==False: - file.write(" %s[fillcolor=%s]\n"%(menuseq.maker.algname, algColor(menuseq.maker.Alg))) - file.write(" %s[fillcolor=%s]\n"%(menuseq.sequence.algname, algColor(menuseq.sequence.Alg))) + file.write(" %s[fillcolor=%s]\n"%(menuseq.maker.Alg.name(), algColor(menuseq.maker.Alg))) + file.write(" %s[fillcolor=%s]\n"%(menuseq.sequence.Alg.name(), algColor(menuseq.sequence.Alg))) menuseq.reuse=True cfseq_algs.append(menuseq.hypo) - file.write(" %s[color=%s]\n"%(menuseq.hypo.algname, algColor(menuseq.hypo.Alg))) + file.write(" %s[color=%s]\n"%(menuseq.hypo.Alg.name(), algColor(menuseq.hypo.Alg))) #combo if cfseq.step.isCombo: - file.write(" %s[color=%s]\n"%(cfseq.step.combo.algname, algColor(cfseq.step.combo.Alg))) + file.write(" %s[color=%s]\n"%(cfseq.step.combo.Alg.name(), algColor(cfseq.step.combo.Alg))) cfseq_algs.append(cfseq.step.combo) file.write(' }\n') @@ -196,8 +196,8 @@ def findConnections(alg_list): dataIntersection = list(set(outs) & set(ins)) if len(dataIntersection) > 0: for line in dataIntersection: - lineconnect+=addConnection(nodeA.algname,nodeB.algname, line) -# print 'Data connections between %s and %s: %s'%(nodeA.algname, nodeB.algname, line) + lineconnect+=addConnection(nodeA.Alg.name(),nodeB.Alg.name(), line) +# print 'Data connections between %s and %s: %s'%(nodeA.Alg.name(), nodeB.Alg.name(), line) return lineconnect @@ -216,8 +216,8 @@ def findDHconnections(nodeA, nodeB): dataIntersection = list(set(outs) & set(ins)) if len(dataIntersection) > 0: for line in dataIntersection: - lineconnect+=addConnection(nodeA.algname,nodeB.algname, line) - print 'Data DH connections between %s and %s: %s'%(nodeA.algname, nodeB.algname, line) + lineconnect+=addConnection(nodeA.Alg.name(),nodeB.Alg.name(), line) + print 'Data DH connections between %s and %s: %s'%(nodeA.Alg.name(), nodeB.Alg.name(), line) return lineconnect diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuChains.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuChains.py index 8fc5968b97977ace09757562f7f149ae050b80f3..5184421bf9c2e4081162416f8690c464962419a9 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuChains.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuChains.py @@ -4,7 +4,9 @@ ## chain name, HypoTool confname (for combined chains there is more than one) ChainDictionary ={ 'HLT_e8' : ['HLT_e8'], + 'HLT_e5' : ['HLT_e5'], 'HLT_e20' : ['HLT_e20'], + 'HLT_g5' : ['HLT_g5'], 'HLT_mu6' : ['HLT_mu6'], 'HLT_mu6Comb' : ['HLT_mu6'], 'HLT_mu6fast' : ['HLT_mu6'], @@ -13,7 +15,8 @@ ChainDictionary ={ 'HLT_e8' : ['HLT_e8'], 'HLT_mu20' : ['HLT_mu20'], 'HLT_2mu6' : ['HLT_2mu6'], # review double object 'HLT_2mu6Comb' : ['HLT_2mu6'], # review double object - 'HLT_mu8_e8' : ['HLT_mu8','HLT_e8'], + 'HLT_mu8_e8' : ['HLT_mu8','HLT_e8'], + 'HLT_e5_e8' : ['HLT_e5', 'HLT_e8'], 'HLT_e3_etcut' : ['HLT_e3_etcut'], 'HLT_e3_etcut1step': ['HLT_e3_etcut'], 'HLT_e5_etcut' : ['HLT_e5_etcut'], @@ -21,6 +24,7 @@ ChainDictionary ={ 'HLT_e8' : ['HLT_e8'], 'HLT_mu6_e3_etcut' : ['HLT_mu6', 'HLT_e3_etcut'], 'HLT_e3_etcut_mu6' : ['HLT_e3_etcut', 'HLT_mu6'], 'HLT_g5_etcut' : ['HLT_g5_etcut'], + 'HLT_e3_g5_etcut' : ['HLT_e3_etcut', 'HLT_g5_etcut'], 'HLT_j85' : ['HLT_j85'], 'HLT_j100' : ['HLT_j100'], 'HLT_j35_gsc45_boffperf_split' : ['HLT_j35_gsc45_boffperf_split'], @@ -37,7 +41,7 @@ def getConfFromChainName(name): else: return [name] log.error("MenuChains.getConfFromChainName: Wrong chain name given: found %s",name) - sys.exit("ERROR, in chain configuration") + sys.exit("ERROR, in getConfFromChainName: Wrong chain configuration") diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py index 2c61801bbc50ecaed9ee664ff85286ae10bf46cb..e718d619b999d959936b6e0a6ce72808dd218a32 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py @@ -12,7 +12,7 @@ class Node(): def __init__(self, Alg): self.name = ("%sNode")%( Alg.name()) self.Alg=Alg - self.algname = Alg.name() +# self.algname = Alg.name() self.inputs=[] self.outputs=[] @@ -29,7 +29,7 @@ class Node(): return self.inputs def __str__(self): - return "Node::%s [%s] -> [%s]"%(self.algname, ' '.join(map(str, self.getInputList())), ' '.join(map(str, self.getOutputList()))) + return "Node::%s [%s] -> [%s]"%(self.Alg.name(), ' '.join(map(str, self.getInputList())), ' '.join(map(str, self.getOutputList()))) @@ -42,12 +42,12 @@ class AlgNode(Node): def addDefaultOutput(self): if self.outputProp is not '': - self.addOutput(("%s_%s"%(self.algname,self.outputProp))) + self.addOutput(("%s_%s"%(self.Alg.name(),self.outputProp))) def setPar(self, prop, name): cval = self.Alg.getProperties()[prop] try: - if type(cval) == type(list()): + if type(cval) == type(list()): cval.append(name) return setattr(self.Alg, prop, cval) else: @@ -63,10 +63,18 @@ class AlgNode(Node): raise "Error in reading property " + prop + " from " + self.Alg def addOutput(self, name): - if self.outputProp is not '': - return self.setPar(self.outputProp,name) - - def getOutputList(self): + outputs = self.readOutputList() + if name in outputs: + log.debug("Warning, %s already set in %s, DH not added",name, self.name) + else: + if self.outputProp is not '': + self.setPar(self.outputProp,name) + else: + sys.exit("no OutputProp set") + Node.addOutput(self, name) + + + def readOutputList(self): outputs = [] cval = self.getPar(self.outputProp) if cval == '': @@ -78,10 +86,18 @@ class AlgNode(Node): return outputs def addInput(self, name): - if self.inputProp is not '': - return self.setPar(self.inputProp,name) - - def getInputList(self): + inputs = self.readInputList() + if name in inputs: + log.debug("Warning, %s already set in %s, DH not added",name, self.name) + else: + if self.inputProp is not '': + self.setPar(self.inputProp,name) + else: + sys.exit("no InputProp set") + Node.addInput(self, name) + + + def readInputList(self): inputs = [] cval = self.getPar(self.inputProp) if cval =='': @@ -93,7 +109,7 @@ class AlgNode(Node): return inputs def __str__(self): - return "Alg::%s [%s] -> [%s]"%(self.algname, ' '.join(map(str, self.getInputList())), ' '.join(map(str, self.getOutputList()))) + return "Alg::%s [%s] -> [%s]"%(self.Alg.name(), ' '.join(map(str, self.getInputList())), ' '.join(map(str, self.getOutputList()))) class HypoToolConf(): @@ -119,7 +135,7 @@ class HypoAlgNode(AlgNode): def __init__(self, Alg): assert isHypoBase(Alg), "Error in creating HypoAlgNode from Alg " + Alg.name() AlgNode.__init__(self, Alg, 'HypoInputDecisions', 'HypoOutputDecisions') - self.addDefaultOutput() + # self.addDefaultOutput() self.tools = [] self.previous=[] @@ -156,8 +172,7 @@ class SequenceFilterNode(AlgNode): self.seeds = [] def setChains(self, name): - if log.isEnabledFor(logging.DEBUG): - log.debug("Adding Chain %s to filter %s"%(name, self.name)) + log.debug("Adding Chain %s to filter %s"%(name, self.Alg.name())) return self.setPar("Chains", name) def getChains(self): @@ -166,6 +181,8 @@ class SequenceFilterNode(AlgNode): 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()) @@ -190,16 +207,14 @@ from DecisionHandling.DecisionHandlingConf import ComboHypo class ComboMaker(AlgNode): def __init__(self, name): Alg = ComboHypo(name) - if log.isEnabledFor(logging.DEBUG): - log.debug("Making combo Alg %s"%name) + log.debug("Making combo Alg %s"%name) AlgNode.__init__(self, Alg, 'HypoInputDecisions', 'HypoOutputDecisions') Alg.OutputLevel = logLevel self.prop="MultiplicitiesMap" def addChain(self, chain): - if log.isEnabledFor(logging.DEBUG): - log.debug("ComboMaker %s adding chain %s"%(self.algname,chain)) + log.debug("ComboMaker %s adding chain %s"%(self.Alg.name(),chain)) from MenuChains import getConfFromChainName confs=getConfFromChainName(chain) for conf in confs: @@ -242,6 +257,34 @@ def isInputMakerBase(alg): def isFilterAlg(alg): return isinstance(alg, RoRSeqFilter) + + +class WrappedList: + def __init__(self, lst): + self._lst = lst + def __getitem__(self, item): + return self._lst[item] + def __setitem__(self, item): + return self._lst.append(item) + + +#class duplicatedHypos(WrappedList): + +## allAlgs={} +## def useExisting(name): +## global allAlgs +## return allAlgs[name] + +## def AlgExisting(name): +## global allAlgs +## return name in allAlgs + + +## def remember(name, instance): +## global allAlgs +## allAlgs[name] = instance +## return instance + ########################################################## # NOW sequences and chains @@ -263,56 +306,54 @@ class MenuSequence(): self.reuse = False # flag to draw dot diagrmas def replaceHypoForCombo(self, HypoAlg): - if log.isEnabledFor(logging.DEBUG): - log.debug("set new Hypo %s for combo sequence %s "%(HypoAlg.name(), self.name)) + log.debug("set new Hypo %s for combo sequence %s "%(HypoAlg.name(), self.name)) self.hypo= HypoAlgNode( Alg=HypoAlg) + + def connectToFilter(self,sfilter, line): + new_output = "%s_from_%s"%(self.hypo.Alg.name(), line) + self.hypo.addOutput(new_output) +# print self.hypo.readOutputList() +# print self.hypo.outputs + self.outputs.append(new_output) - def connectToFilter(self,sfilter): - filter_output = sfilter.getOutputList() - inputs=[filter_output[i] for i,fseed in enumerate (sfilter.seeds) if self.seed in fseed ] - if log.isEnabledFor(logging.DEBUG): - log.debug("connectToFilter: found %d inputs to sequence::%s from Filter::%s (from seed %s)", - len(inputs), self.name, sfilter.algname, self.seed) - for i in inputs: log.debug("- "+i) - if len(inputs) == 0: - sys.exit("ERROR, no inputs to sequence are set!") - for inp in inputs: - new_output = "%s_from_%s"%(self.hypo.algname, inp) - self.hypo.addOutput(new_output) - self.outputs.append( new_output) - #### Connect the InputMaker - for i in inputs: - self.maker.addInput(i) - self.inputs.append(i) - input_maker_output=["%s_from_%s"%(self.maker.algname,i) for i in inputs ] - if len(input_maker_output) == 0: - sys.exit("ERROR, no outputs to sequence are set!") - for out in input_maker_output: - self.maker.addOutput(out) - self.hypo.setPreviousDecision(out) - if log.isEnabledFor(logging.DEBUG): - log.debug("connectToFilter: connecting InputMaker to HypoAlg: adding %d output to InputMaker::%s and sending to HypoAlg::%s", - len(inputs), self.maker.algname, self.hypo.algname) - for i in inputs: log.debug(i) + self.maker.addInput(line) + self.inputs.append(line) + + input_maker_output="%s_from_%s"%(self.maker.Alg.name(),line) + 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, HypoAlg::%s.output=%s",\ + self.maker.Alg.name(), input_maker_output, self.hypo.Alg.name(), input_maker_output, self.hypo.Alg.name(), ) + def __str__(self): - return "MenuSequence::%s \n Hypo::%s \n Maker::%s \n Sequence::%s"%(self.name, self.hypo, self.maker, self.sequence) + return "MenuSequence::%s \n Hypo::%s \n Maker::%s \n Sequence::%s"%(self.name, self.hypo, self.maker, self.sequence, new_output) class Chain: """Basic class to define the trigger menu """ def __init__(self, name, Seed, ChainSteps=[]): self.name = name - self.seed=Seed self.steps=ChainSteps - self.vseeds = Seed.strip().split("_") - self.vseeds.pop(0) #remove first L1 string + self.seed=Seed + self.vseeds=[] + vseeds = Seed.strip().split("_") + vseeds.pop(0) #remove first L1 string + # split multi seeds + for seed in vseeds: + split=re.findall(r"(\d+)?([A-Z]+\d+)", seed) + mult,single = split[0] + if not mult: mult=1 + else: mult=int(mult) +# print mult,single + for m in range(0,mult): self.vseeds.append(single) + # group_seed is used to se tthe seed type (EM, MU,JET), removing the actual threshold self.group_seed = ["L1"+filter(lambda x: x.isalpha(), stri) for stri in self.vseeds] self.setSeedsToSequences() # save seed of each menuseq - if log.isEnabledFor(logging.DEBUG): - log.debug("Chain " + name + " with seeds: %s "%str( self.vseeds)) + log.debug("Chain " + name + " with seeds: %s "%str( self.vseeds)) for step in self.steps: if step.isCombo: @@ -330,8 +371,7 @@ class Chain: for step in self.steps: seq=step.sequences[nseq] seq.seed ="L1"+filter(lambda x: x.isalpha(), seed) - if log.isEnabledFor(logging.DEBUG): - log.debug( "Chain %s adding seed %s to sequence %d in step %s"%(self.name, seq.seed, nseq, step.name)) + log.debug( "Chain %s adding seed %s to sequence %d in step %s"%(self.name, seq.seed, nseq, step.name)) nseq+=1 else: @@ -355,17 +395,46 @@ class Chain: class CFSequence(): - """Class to describe the ChainStep + filter""" + """Class to describe the ChainStep + filter + + """ def __init__(self, ChainStep, FilterAlg): self.name = ChainStep.name # not needed? self.filter = FilterAlg - self.step=ChainStep + self.step = ChainStep self.connect() def connect(self): - """Connect filter to ChainStep (all its sequences)""" + """Connect filter to ChainStep (all its sequences) + if a ChainStep contains the same sequence multiple times (for multi-object chains), + the filter is connected only once (to avoid multiple DH links) + """ + + log.debug("CFSequence: Connect Filter %s with menuSequences of step %s"%(self.filter.Alg.name(), self.step.name)) + filter_output = self.filter.getOutputList() + if len(filter_output) == 0: + sys.exit("ERROR, no filter outputs are set!") + + # check whether the number of filter outputs are the same as the number of sequences in the step + if len(filter_output) != len(self.step.sequences): + sys.exit("ERROR: Found %d filter outputs differnt from %d MenuSequences in Step %s"%( len(self.filter.getOutputList()), len(self.step.sequences), self.step.name)) + + + nseq=0 for seq in self.step.sequences: - seq.connectToFilter(self.filter) + #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 ) + nseq+=1 + if self.step.isCombo: self.connectCombo() @@ -377,13 +446,13 @@ class CFSequence(): for seq in self.step.sequences: combo_input=seq.hypo.getOutputList()[0] self.step.combo.addInput(combo_input) - log.debug("Adding inputs %s to combo %s"%(combo_input, self.step.combo.algname)) + log.debug("Adding inputs %s to combo %s"%(combo_input, self.step.combo.Alg.name())) # inputs are the output decisions of the hypos of the sequences # outputs are the modified name of input deciions that need to be connected to the next filter combo_output="combo_%s"%combo_input self.step.combo.addOutput(combo_output) seq.outputs.append(combo_output) - log.debug("Adding outputs %s to combo %s"%(combo_output, self.step.combo.algname)) + log.debug("Adding outputs %s to combo %s"%(combo_output, self.step.combo.Alg.name())) def __str__(self): @@ -405,6 +474,7 @@ class ChainStep: self.makeCombo(Sequences) else: self.sequences = Sequences + def replaceSequence(self, old, new): @@ -414,15 +484,21 @@ class ChainStep: self.sequences.insert(idx, new) def makeCombo(self, Sequences): - # For combo sequences, duplicate the Hypo with a Combo_name and create the comboHypoAlg + # For combo sequences, duplicate the sequence, the Hypo with differnt names and create the ComboHypoAlg self.combo = ComboMaker("ComboHypo_%s"%self.name) - for sequence in Sequences: - new_sequence=copy.deepcopy(sequence) - new_sequence.name=("%s_Combo"%sequence.name) + duplicatedHypos = [] + for sequence in Sequences: oldhypo=sequence.hypo.Alg - new_hypoAlg=oldhypo.clone("%s_Combo"%oldhypo.name()) + duplicatedHypos.append(oldhypo.name()) + ncopy=duplicatedHypos.count(oldhypo.name()) + + new_sequence=copy.deepcopy(sequence) + new_sequence.name="%s%d_for_%s"%(sequence.name,ncopy, self.name) + + newHypoAlgName = "%s%d_for_%s"%(oldhypo.name(),ncopy, self.name) + new_hypoAlg=oldhypo.clone(newHypoAlgName) new_sequence.replaceHypoForCombo(new_hypoAlg) - self.sequences.append(new_sequence) + self.sequences.append(new_sequence) def __str__(self): return "--- ChainStep %s ---\n + isCombo: %d \n + %s \n "%(self.name, self.isCombo, ' '.join(map(str, self.sequences) ))