440def makeCombinedStep(parallel_steps, stepNumber, chainDefList, allSteps = None, currentChainSteps = None, leg_numbering = None, alignment_group = ""):
441
442 if allSteps is None: allSteps = []
443 if currentChainSteps is None: currentChainSteps = []
444 if leg_numbering is None: leg_numbering =[]
445
446 stepName = 'merged'
447
448 log.debug("[makeCombinedStep] stepNumber %d, alignment_group %s, %d steps: [%s], %d chain list: [%s], alignment groups: [%s]", stepNumber, alignment_group, len(parallel_steps), ', '.join([step.name if step is not None else "EMPTY" for step in parallel_steps ]), len(chainDefList), ', '.join([chain.name for chain in chainDefList]), ', '.join([chain.alignmentGroups[0] for chain in chainDefList]))
449
450
451 stepDicts = []
452 comboHypoTools = []
453 comboHypo = None
454
455 leg_counter = 0
456 currentStepName = ''
457
458
459 hasNonEmptyStep = checkStepContent(parallel_steps)
460 log.debug("hasNonEmptyStep %d", hasNonEmptyStep)
461
462 if not hasNonEmptyStep:
463
464 if len(parallel_steps)>=len(chainDefList) and all(step is None for step in parallel_steps[len(chainDefList):]):
465
466
467
468 parallel_steps=parallel_steps[:len(chainDefList)]
469 log.debug("[makeCombinedStep] removing empty steps exceeding chainDefList size. The new steps are now %s ", parallel_steps)
470
471 for chain_index, step in enumerate(parallel_steps):
472
473 if step is None or step.isEmpty:
474 new_stepDicts = deepcopy(chainDefList[chain_index].steps[-1].stepDicts)
475 nLegs = chainDefList[chain_index].steps[-1].nLegs
476 currentStepName = getMergedEmptyStepName(chainDefList[chain_index].alignmentGroups[0], stepNumber, nLegs, new_stepDicts[0]['signature'])
477 log.debug('[makeCombinedStep] step has no sequences, making empty step %s', currentStepName)
478
479
480 for new_stepDict in new_stepDicts:
481 oldLegName = new_stepDict['chainName']
482 if re.search('^leg[0-9]{3}_',oldLegName):
483 oldLegName = oldLegName[7:]
484 new_stepDict['chainName'] = legName(oldLegName,leg_counter)
485 log.debug("[makeCombinedStep] stepDict naming old: %s, new: %s", oldLegName, new_stepDict['chainName'])
486 stepDicts.append(new_stepDict)
487 leg_counter += 1
488
489 else:
490
491 currentStepName = step.name
492
493
494 if currentStepName.startswith('merged_'):
495 currentStepName = currentStepName[7:]
496
497
498 log.debug('[makeCombinedStep] adding step dictionaries %s',step.stepDicts)
499
500 for new_stepDict in deepcopy(step.stepDicts):
501 oldLegName = new_stepDict['chainName']
502 if re.search('^leg[0-9]{3}_',oldLegName):
503 oldLegName = oldLegName[7:]
504 if len(leg_numbering) > 0:
505 leg_counter = leg_numbering[chain_index]
506 new_stepDict['chainName'] = legName(oldLegName,leg_counter)
507 log.debug("[makeCombinedStep] stepDict naming old: %s, new: %s", oldLegName, new_stepDict['chainName'])
508 stepDicts.append(new_stepDict)
509 leg_counter += 1
510
511 stepName += '_' + currentStepName
512
513 theChainStep = ChainStep(stepName, chainDicts = stepDicts, isEmpty = True)
514 log.debug("[makeCombinedStep] Merged empty step: %s", theChainStep.name)
515 return theChainStep
516
517 stepSeq = []
518 alignLegsInStep = []
519
520
521
522
523 for num, chain in enumerate(chainDefList):
524 alignLegsInStep.append(len(chain.alignmentGroups))
525 assert(len(alignLegsInStep) == len(parallel_steps))
526
527 for chain_index, step in enumerate(parallel_steps):
528
529 if step is None or (hasNonEmptyStep and step.isEmpty):
530
531
532
533 log.debug("[makeCombinedStep] step %s is Empty and has %d alignemnt group legs", step.name if step is not None else "None", alignLegsInStep[chain_index])
534 if alignment_group == "":
535 alignment_group = chainDefList[0].alignmentGroups[0]
536
537
538 for innerLeg in range(alignLegsInStep[chain_index]):
539 new_stepDict = deepcopy(chainDefList[chain_index].steps[-1].stepDicts[-1])
540 seqName = getEmptySeqName( new_stepDict['signature'], stepNumber, alignment_group, innerLeg)
541 log.debug("[makeCombinedStep] creating Empty sequence %s", seqName)
542 signature=new_stepDict['signature']
543 is_fs_string = 'FS' if isFullScanRoI(chainDefList[chain_index].L1decisions[0]) else ''
544 seqName=seqName+is_fs_string
545 signature=new_stepDict['signature']+is_fs_string
546 thisEmpty = createEmptyMenuSequenceCfg(flags=None, name=seqName)
547 stepSeq.append(functools.partial(thisEmpty, flags=None, name=seqName))
548 oldLegName = new_stepDict['chainName']
549 if re.search('^leg[0-9]{3}_',oldLegName):
550 oldLegName = oldLegName[7:]
551 new_stepDict['chainName'] = legName(oldLegName,leg_counter)
552 stepDicts.append(new_stepDict)
553 leg_counter += 1
554
555 nLegs = alignLegsInStep[chain_index]
556 currentStepName = getMergedEmptyStepName(alignment_group, stepNumber, nLegs, signature)
557
558 log.debug("[makeCombinedStep] found empty step to be merged, step number: %d chain_index: %s, step name: %s, made new empty sequence name: %s", stepNumber, chain_index, currentStepName, seqName)
559
560
561 else:
562
563 log.debug("[makeCombinedStep] step %s with nLegs = %s", step.name, str(step.nLegs))
564 if len(step.sequenceGens):
565 log.debug(
"[makeCombinedStep] with sequences = [%s]",
', '.join(
map(str, [seq.func.__name__
for seq
in step.sequenceGens])))
566
567
568 if len(step.sequenceGens) > 1:
569 log.debug("[makeCombinedStep] combining in an already combined chain")
570
571 comboHypo = step.comboHypoCfg
572 currentStepName = step.name
573
574 if currentStepName.startswith('merged_'):
575 currentStepName = currentStepName[7:]
576 stepSeq.extend(step.sequenceGens)
577 comboHypoTools.extend(step.comboToolConfs)
578
579 log.debug('[makeCombinedStep] adding step dictionaries %s',step.stepDicts)
580 log.debug('[makeCombinedStep] my leg_numbering is: %s, for chain_index %s',leg_numbering, chain_index)
581 for new_stepDict in deepcopy(step.stepDicts):
582 oldLegName = new_stepDict['chainName']
583 if re.search('^leg[0-9]{3}_',oldLegName):
584 oldLegName = oldLegName[7:]
585 if len(leg_numbering) > 0:
586 leg_counter = leg_numbering[chain_index]
587 new_stepDict['chainName'] = legName(oldLegName,leg_counter)
588 log.debug("[makeCombinedStep] stepDict naming old: %s, new: %s", oldLegName, new_stepDict['chainName'])
589 stepDicts.append(new_stepDict)
590 leg_counter += 1
591
592
593
594 stepName += '_' + currentStepName
595 log.debug('[makeCombinedStep] current step name %s, with %d sequences',stepName, len(stepSeq))
596
597
598 comboHypoTools = list(
set(comboHypoTools))
599 theChainStep = ChainStep(stepName, SequenceGens = stepSeq, chainDicts = stepDicts,
600 comboHypoCfg = comboHypo, comboToolConfs = comboHypoTools)
601 log.debug("[makeCombinedStep] Merged step index %d: \n %s", stepNumber, theChainStep)
602
603
604 return theChainStep
605
606