9def splitInterSignatureChainDict(chainDict):
10 listOfSplitChainDicts = []
11
12 move_jets = 'Bjet' in chainDict['signatures']
13
14
15
16 for chainPart in chainDict['chainParts']:
17 thisSignature = chainPart['signature']
18 chainPartAdded = False
19
20 for splitChainDict in listOfSplitChainDicts:
21 splitSignature = splitChainDict['chainParts'][0]['signature']
22 if thisSignature == splitSignature or \
23 (move_jets and thisSignature == 'Jet' and splitSignature == 'Bjet') or \
24 (move_jets and thisSignature == 'Bjet' and splitSignature == 'Jet'):
25 splitChainDict['chainParts'] += [chainPart]
26 chainPartAdded = True
27 break
28 if not chainPartAdded:
29 newSplitChainDict = deepcopy(chainDict)
30 newSplitChainDict['chainParts'] = [chainPart]
31 newSplitChainDict['signature'] = chainPart['signature']
32 listOfSplitChainDicts += [newSplitChainDict]
33
34 if move_jets:
35 for newDict in listOfSplitChainDicts:
36 if newDict['signature'] == 'Jet':
37 newDict['signature'] = 'Bjet'
38
39
40
41
42 for splitChainDict in listOfSplitChainDicts:
43 if 'AND' in [part['extra'] for part in splitChainDict['chainParts']]:
44 log.info("Implement extra splitting, triggered by AND key (%s.)", chainDict['chainName'])
45
46 listOfSplitChainDicts=[]
47 addNewSplit= False
48 for chainPart in chainDict['chainParts']:
49 thisSignature = chainPart['signature']
50 chainPartAdded = False
51
52
53
54 if addNewSplit:
55 thisSignature = 'extraSplit'
56 addNewSplit = False
57
58
59
60 if 'AND' in chainPart['extra']:
61 addNewSplit = True
62
63
64 for splitChainDict in listOfSplitChainDicts:
65
66 if 'AND' in [part['extra'] for part in splitChainDict['chainParts']]:
67 continue
68 if thisSignature == splitChainDict['chainParts'][0]['signature']:
69
70 splitChainDict['chainParts'] += [chainPart]
71 chainPartAdded = True
72 break
73 if not chainPartAdded:
74 newSplitChainDict = deepcopy(chainDict)
75 newSplitChainDict['chainParts'] = [chainPart]
76 newSplitChainDict['signature'] = chainPart['signature']
77 listOfSplitChainDicts += [newSplitChainDict]
78
79
80
81
82
83 orderedListOfSplitChainDicts = []
84 if "mergingOrder" not in chainDict:
85 log.debug("No merging order given for chain %s.", chainDict['chainName'])
86 elif chainDict["mergingOrder"] == []:
87 log.debug("No merging order given for chain %s.", chainDict['chainName'])
88 else:
89 for chainPartName in chainDict["mergingOrder"]:
90 for splitChainDict in listOfSplitChainDicts:
91 if splitChainDict['chainParts'][0]['chainPartName'] == chainPartName:
92 orderedListOfSplitChainDicts += [splitChainDict]
93
94 if not len(orderedListOfSplitChainDicts) == len(listOfSplitChainDicts):
95 for chainPartName in chainDict["mergingOrder"]:
96 log.error("Ordering of split chain dicts failed. Please check that orderedListOfSplitChainDicts and listOfSplitChainDicts contain the same elements!!")
97 log.info(chainDict)
98
99 return orderedListOfSplitChainDicts
100
101 return listOfSplitChainDicts
102
103