439 def makeCombinedStep(parallel_steps, stepNumber, chainDefList, allSteps = None, currentChainSteps = None, leg_numbering = None, alignment_group = ""):
441 if allSteps
is None: allSteps = []
442 if currentChainSteps
is None: currentChainSteps = []
443 if leg_numbering
is None: leg_numbering =[]
447 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]))
459 log.debug(
"hasNonEmptyStep %d", hasNonEmptyStep)
461 if not hasNonEmptyStep:
463 if len(parallel_steps)>=len(chainDefList)
and all(step
is None for step
in parallel_steps[len(chainDefList):]):
467 parallel_steps=parallel_steps[:len(chainDefList)]
468 log.debug(
"[makeCombinedStep] removing empty steps exceeding chainDefList size. The new steps are now %s ", parallel_steps)
470 for chain_index, step
in enumerate(parallel_steps):
472 if step
is None or step.isEmpty:
473 new_stepDicts = deepcopy(chainDefList[chain_index].steps[-1].stepDicts)
474 nLegs = len(chainDefList[chain_index].steps[-1].multiplicity)
475 currentStepName =
getMergedEmptyStepName(chainDefList[chain_index].alignmentGroups[0], stepNumber, nLegs, new_stepDicts[0][
'signature'])
476 log.debug(
'[makeCombinedStep] step has no sequences, making empty step %s', currentStepName)
479 for new_stepDict
in new_stepDicts:
480 oldLegName = new_stepDict[
'chainName']
481 if re.search(
'^leg[0-9]{3}_',oldLegName):
482 oldLegName = oldLegName[7:]
483 new_stepDict[
'chainName'] =
legName(oldLegName,leg_counter)
484 log.debug(
"[makeCombinedStep] stepDict naming old: %s, new: %s", oldLegName, new_stepDict[
'chainName'])
485 stepDicts.append(new_stepDict)
490 currentStepName = step.name
493 if currentStepName.startswith(
'merged_'):
494 currentStepName = currentStepName[7:]
497 log.debug(
'[makeCombinedStep] adding step dictionaries %s',step.stepDicts)
499 for new_stepDict
in deepcopy(step.stepDicts):
500 oldLegName = new_stepDict[
'chainName']
501 if re.search(
'^leg[0-9]{3}_',oldLegName):
502 oldLegName = oldLegName[7:]
503 if len(leg_numbering) > 0:
504 leg_counter = leg_numbering[chain_index]
505 new_stepDict[
'chainName'] =
legName(oldLegName,leg_counter)
506 log.debug(
"[makeCombinedStep] stepDict naming old: %s, new: %s", oldLegName, new_stepDict[
'chainName'])
507 stepDicts.append(new_stepDict)
510 stepName +=
'_' + currentStepName
512 theChainStep = ChainStep(stepName, chainDicts = stepDicts, isEmpty =
True)
513 log.debug(
"[makeCombinedStep] Merged empty step: \n %s", theChainStep)
522 for num, chain
in enumerate(chainDefList):
523 legsInStep.append(len(chain.alignmentGroups))
524 assert(len(legsInStep) == len(parallel_steps))
526 for chain_index, step
in enumerate(parallel_steps):
528 if step
is None or (hasNonEmptyStep
and step.isEmpty):
532 log.debug(
"[makeCombinedStep] step %s is Empty and has %d legs", step.name
if step
is not None else "None", legsInStep[chain_index])
533 if alignment_group ==
"":
534 alignment_group = chainDefList[0].alignmentGroups[0]
537 for innerLeg
in range(legsInStep[chain_index]):
538 new_stepDict = deepcopy(chainDefList[chain_index].steps[-1].stepDicts[-1])
539 seqName =
getEmptySeqName( new_stepDict[
'signature'], stepNumber, alignment_group, innerLeg)
540 log.debug(
"[makeCombinedStep] creating Empty sequence %s", seqName)
541 signature=new_stepDict[
'signature']
542 is_fs_string =
'FS' if isFullScanRoI(chainDefList[chain_index].L1decisions[0])
else ''
543 seqName=seqName+is_fs_string
544 signature=new_stepDict[
'signature']+is_fs_string
546 stepSeq.append(functools.partial(thisEmpty, name=seqName))
547 oldLegName = new_stepDict[
'chainName']
548 if re.search(
'^leg[0-9]{3}_',oldLegName):
549 oldLegName = oldLegName[7:]
550 new_stepDict[
'chainName'] =
legName(oldLegName,leg_counter)
551 stepDicts.append(new_stepDict)
554 nLegs = legsInStep[chain_index]
557 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)
562 log.debug(
"[makeCombinedStep] step %s, multiplicity = %s", step.name,
str(step.multiplicity))
563 if len(step.sequenceGens):
564 log.debug(
"[makeCombinedStep] with sequences = %s",
' '.
join(map(str, [seq.func.__name__
for seq
in step.sequenceGens])))
567 if len(step.sequenceGens) > 1:
568 log.debug(
"[makeCombinedStep] combining in an already combined chain")
570 if ( comboHypo
is None or
571 (hasattr(step.comboHypoCfg,
'__name__')
and step.comboHypoCfg.__name__ !=
"ComboHypoCfg") ):
572 comboHypo = step.comboHypoCfg
573 currentStepName = step.name
575 if currentStepName.startswith(
'merged_'):
576 currentStepName = currentStepName[7:]
577 stepSeq.extend(step.sequenceGens)
578 comboHypoTools.extend(step.comboToolConfs)
580 log.debug(
'[makeCombinedStep] adding step dictionaries %s',step.stepDicts)
581 log.debug(
'[makeCombinedStep] my leg_numbering is: %s, for chain_index %s',leg_numbering, chain_index)
582 for new_stepDict
in deepcopy(step.stepDicts):
583 oldLegName = new_stepDict[
'chainName']
584 if re.search(
'^leg[0-9]{3}_',oldLegName):
585 oldLegName = oldLegName[7:]
586 if len(leg_numbering) > 0:
587 leg_counter = leg_numbering[chain_index]
588 new_stepDict[
'chainName'] =
legName(oldLegName,leg_counter)
589 log.debug(
"[makeCombinedStep] stepDict naming old: %s, new: %s", oldLegName, new_stepDict[
'chainName'])
590 stepDicts.append(new_stepDict)
595 stepName +=
'_' + currentStepName
596 log.debug(
'[makeCombinedStep] current step name %s, with %d sequences',stepName, len(stepSeq))
599 comboHypoTools =
list(
set(comboHypoTools))
600 theChainStep = ChainStep(stepName, SequenceGens = stepSeq, chainDicts = stepDicts,
601 comboHypoCfg = comboHypo, comboToolConfs = comboHypoTools)
602 log.debug(
"[makeCombinedStep] Merged step index %d: \n %s", stepNumber, theChainStep)