440 def makeCombinedStep(parallel_steps, stepNumber, chainDefList, allSteps = None, currentChainSteps = None, leg_numbering = None, alignment_group = ""):
442 if allSteps
is None: allSteps = []
443 if currentChainSteps
is None: currentChainSteps = []
444 if leg_numbering
is None: leg_numbering =[]
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]))
460 log.debug(
"hasNonEmptyStep %d", hasNonEmptyStep)
462 if not hasNonEmptyStep:
464 if len(parallel_steps)>=len(chainDefList)
and all(step
is None for step
in parallel_steps[len(chainDefList):]):
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)
471 for chain_index, step
in enumerate(parallel_steps):
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)
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)
491 currentStepName = step.name
494 if currentStepName.startswith(
'merged_'):
495 currentStepName = currentStepName[7:]
498 log.debug(
'[makeCombinedStep] adding step dictionaries %s',step.stepDicts)
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)
511 stepName +=
'_' + currentStepName
513 theChainStep = ChainStep(stepName, chainDicts = stepDicts, isEmpty =
True)
514 log.debug(
"[makeCombinedStep] Merged empty step: \n %s", theChainStep)
523 for num, chain
in enumerate(chainDefList):
524 alignLegsInStep.append(len(chain.alignmentGroups))
525 assert(len(alignLegsInStep) == len(parallel_steps))
527 for chain_index, step
in enumerate(parallel_steps):
529 if step
is None or (hasNonEmptyStep
and step.isEmpty):
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]
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
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)
555 nLegs = alignLegsInStep[chain_index]
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)
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])))
568 if len(step.sequenceGens) > 1:
569 log.debug(
"[makeCombinedStep] combining in an already combined chain")
571 if ( comboHypo
is None or
572 (hasattr(step.comboHypoCfg,
'__name__')
and step.comboHypoCfg.__name__ !=
"ComboHypoCfg") ):
573 comboHypo = step.comboHypoCfg
574 currentStepName = step.name
576 if currentStepName.startswith(
'merged_'):
577 currentStepName = currentStepName[7:]
578 stepSeq.extend(step.sequenceGens)
579 comboHypoTools.extend(step.comboToolConfs)
581 log.debug(
'[makeCombinedStep] adding step dictionaries %s',step.stepDicts)
582 log.debug(
'[makeCombinedStep] my leg_numbering is: %s, for chain_index %s',leg_numbering, chain_index)
583 for new_stepDict
in deepcopy(step.stepDicts):
584 oldLegName = new_stepDict[
'chainName']
585 if re.search(
'^leg[0-9]{3}_',oldLegName):
586 oldLegName = oldLegName[7:]
587 if len(leg_numbering) > 0:
588 leg_counter = leg_numbering[chain_index]
589 new_stepDict[
'chainName'] =
legName(oldLegName,leg_counter)
590 log.debug(
"[makeCombinedStep] stepDict naming old: %s, new: %s", oldLegName, new_stepDict[
'chainName'])
591 stepDicts.append(new_stepDict)
596 stepName +=
'_' + currentStepName
597 log.debug(
'[makeCombinedStep] current step name %s, with %d sequences',stepName, len(stepSeq))
600 comboHypoTools =
list(
set(comboHypoTools))
601 theChainStep = ChainStep(stepName, SequenceGens = stepSeq, chainDicts = stepDicts,
602 comboHypoCfg = comboHypo, comboToolConfs = comboHypoTools)
603 log.debug(
"[makeCombinedStep] Merged step index %d: \n %s", stepNumber, theChainStep)