185def createDataFlow(flags, chains):
186 """ Creates the filters and connect them to the menu sequences"""
187
188
189 chainWithMaxSteps =
max(chains, key =
lambda chain: len(chain.steps))
190 NSTEPS = len(chainWithMaxSteps.steps)
191 log.info("[createDataFlow] creating DF for %d chains and total %d steps", len(chains), NSTEPS)
192
193
194 finalDecisions = [ [] for n in range(NSTEPS) ]
195 CFseqList = [ [] for n in range(NSTEPS) ]
196 CFSeqByFilterName = [ {} for n in range(NSTEPS) ]
197
198
199 for chain in chains:
200 log.debug(
"\n Configuring chain %s with %d steps: \n - %s ", chain.name,len(chain.steps),
'\n - '.join(
map(str, [{step.name:step.nLegs}
for step
in chain.steps])))
201
202 lastCFgroup = None
203 lastDecisions = []
204 for nstep, chainStep in enumerate( chain.steps ):
205 if not flags.Trigger.fastMenuGeneration:
206
207 chainStep.createSequences()
208 log.debug("\n************* Start connecting step %d %s for chain %s", nstep+1, chainStep.name, chain.name)
209 if nstep == 0:
210 filterInput = chain.L1decisions
211 else:
212 filterInput = lastDecisions
213 if len(filterInput) == 0 :
214 log.error("[createDataFlow] Filter for step %s has %d inputs! At least one is expected", chainStep.name, len(filterInput))
215 raise Exception("[createDataFlow] Cannot proceed, exiting.")
216
217 log.debug("Set Filter input: %s while setting the chain: %s", filterInput, chain.name)
218
219
220 sequenceFilter = None
221 filterName = CFNaming.filterName(chainStep.name)
222 if chainStep.isEmpty:
223 filterOutput = filterInput
224 else:
225 filterOutput = [CFNaming.filterOutName(filterName, inputName) for inputName in filterInput ]
226
227
228 foundCFgroup = CFSeqByFilterName[nstep].
get(filterName,
None)
229 log.debug("%s CF sequences with filter name %s", "Not found" if foundCFgroup is None else "Found", filterName)
230 if foundCFgroup is None:
231 sequenceFilter = buildFilter(filterName, filterInput, chainStep.isEmpty)
232 if flags.Trigger.fastMenuGeneration:
233
234 chainStep.createSequences()
235
236 CFgroup = CFGroup( ChainStep = chainStep, FilterAlg = sequenceFilter)
237 CFgroup.connect(filterOutput)
238 CFSeqByFilterName[nstep][sequenceFilter.Alg.getName()] = CFgroup
239 CFseqList[nstep].append(CFgroup)
240 lastCFgroup = CFgroup
241 else:
242 lastCFgroup = foundCFgroup
243 sequenceFilter = lastCFgroup.sequenceCA.filterNode
244 if len(list(
set(sequenceFilter.getInputList()).
intersection(filterInput))) != len(list(
set(filterInput))):
245 [ sequenceFilter.addInput(inputName) for inputName in filterInput ]
246 [ sequenceFilter.addOutput(outputName) for outputName in filterOutput ]
247 lastCFgroup.connect(filterOutput)
248
249 lastDecisions = lastCFgroup.sequenceCA.decisions
250
251
252 chainLegs = chainStep.getChainLegs()
253 if len(chainLegs) != len(filterInput):
254 log.error("[createDataFlow] lengths of chainlegs = %s differ from inputs = %s", str(chainLegs), str(filterInput))
255 raise Exception("[createDataFlow] Cannot proceed, exiting.")
256 for finput, leg in zip(filterInput, chainLegs):
257 log.debug("Adding chain %s to input %s of %s", leg, finput, sequenceFilter.Alg.name)
258 sequenceFilter.addChain(leg, finput)
259
260 log.debug("Now Filter has chains: %s", sequenceFilter.getChains())
261 log.debug("Now Filter has chains/input: %s", sequenceFilter.getChainsPerInput())
262
263 lastCFgroup.addStepLeg(chainStep, chain.name)
264
265 if len(chain.steps) == nstep+1:
266 log.debug("Adding finalDecisions for chain %s at step %d:", chain.name, nstep+1)
267 for dec in lastDecisions:
268 finalDecisions[nstep].append(dec)
269 log.debug(dec)
270
271
272 log.debug(
"\n Built CD for chain %s with %d steps: \n - %s ", chain.name,len(chain.steps),
'\n - '.join(
map(str, [{step.name:step.nLegs}
for step
in chain.steps])))
273
274
275 log.debug("End of createDataFlow for %d chains and total %d steps", len(chains), NSTEPS)
276 return (finalDecisions, CFseqList)
277
278
std::vector< std::string > intersection(std::vector< std::string > &v1, std::vector< std::string > &v2)
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)