65 preselChainDict = dict(mainChainDict)
66 preselChainDict[
'chainParts']=[]
71 presel_matched = re.match(
r'presel(?P<cut>(VETOMULT)?\d?\d?(Z[\d\D]+)?[jacf]\d?(HT)?[\d\D]+)', trkpresel)
72 assert presel_matched
is not None,
"Impossible to match preselection pattern for self.trkpresel=\'{0}\'.".
format(trkpresel)
73 presel_cut_str = presel_matched.groupdict()[
'cut']
75 usingDIPZ =
bool(re.match(
r'.*Z', presel_cut_str))
77 findSel = re.finditer(
r'(?P<nJet>\d?[jacf])(?P<ptcut>\d+)', presel_cut_str)
81 nJ = match.group(
"nJet")
82 findAllJets.append(
'1'+nJ
if len(nJ)==1
else nJ)
83 findAllPts.append(
int(match.group(
"ptcut")))
84 nAllJets =
sum(
int(i[:-1])
for i
in findAllJets)
85 nCentralJets =
sum(
int(i[:-1])
if 'c' in i
else 0
for i
in findAllJets)
86 ptCut =
min(
int(i)
for i
in findAllPts)
87 assert nAllJets == nCentralJets,
"Your preselection has a DIPZ part but not only central jets were required. This isn't currently supported. Please investigate."
89 preselCommonJetParts = dict(JetChainParts_Default)
91 for ip,p
in enumerate(presel_cut_str.split(
'XX')):
92 hascalSel=
bool(re.match(
r'.*emf\w?\d+', p))
96 p = re.sub(
r'(b|bg|bgtwo|gntau|uht1tau)\d\d',
'', p)
98 hasBjetSel =
bool(re.match(
r'.*(b|bg|bgtwo)\d\d', p))
99 hasTauSel =
bool(re.match(
r'.*(gntau|uht1tau)\d\d', p))
100 hasDIPZsel =
bool(re.match(
r'.*Z', p))
102 if hasDIPZsel
and not doTaggingSel:
continue
103 if usingDIPZ
and not hasDIPZsel
and not hasBjetSel
and doTaggingSel:
continue
105 assert not ( (hasBjetSel
or hasDIPZsel)
and not doTaggingSel),
"Your jet preselection has a b-jet or DIPZ part but a calo-only preselection was requested instead. This should not be possible. Please investigate."
107 bmatches =
r'(?P<btagger>(b|bg|bgtwo))(?P<bwp>\d\d)' if hasBjetSel
else ""
108 taumatches =
r'(?P<tauid>(gntau|uht1tau))(?P<tauwp>\d\d)' if hasTauSel
else ""
110 pattern_to_test =
r'(?P<veto>(VETOMULT))?'
111 pattern_to_test +=
r'(?P<mult>\d*)?(?P<region>[jacf])'
112 pattern_to_test +=
r'(?P<scenario>(HT))?(?P<cut>\d+)?'
113 pattern_to_test += bmatches
114 pattern_to_test += taumatches
115 pattern_to_test +=
r'emf(?P<emfc>\d+)' if hascalSel
else ''
116 if hasDIPZsel: pattern_to_test =
r'(?P<scenario>Z)(?P<dipzwp>\d+)?(?P<prefilt>(MAXMULT\d+[jacf]?)?)'
117 matched = re.match(pattern_to_test, p)
118 assert matched
is not None,
"Impossible to extract preselection cut for \'{0}\' substring. Please investigate.".
format(p)
119 cut_dict = matched.groupdict()
120 if hasDIPZsel: cut_dict[
'region'] =
'c'
121 if hasDIPZsel: cut_dict[
'cut'] = ptCut
126 [
"mult" ,
"emfc" ,
"cut" ,
"cut_add" ,
"prefilt"
127 ,
"bwp" ,
"btagger" ,
"dipzwp"
133 cut_dict.setdefault(k,
"")
135 veto =
'veto' in cut_dict
137 veto = cut_dict[
'veto']
is not None
138 mult = cut_dict[
'mult']
139 region = cut_dict[
'region']
140 scenario = cut_dict[
'scenario']
141 cut = cut_dict[
'cut']
142 dipzwp = cut_dict[
'dipzwp']
143 emfc = cut_dict[
'emfc']
146 if mult==
'': mult=
'1'
147 etarange = etaRangeAbbrev[region]
149 scenario = cut_dict[
'veto'][4:]
150 assert (
not (scenario
in [
'HT',
'Z'])),
"Veto preselection not yet supported for HT or Z scenarios. Please investigate."
152 hyposcenario=f
'HT{cut}XX{etarange}'
154 chainPartName=f
'j0_{hyposcenario}'
155 elif scenario ==
"Z":
156 hyposcenario=f
'Z{dipzwp}XX{nCentralJets}c{cut}'
157 prefilt = cut_dict[
'prefilt']
158 if prefilt !=
'': prefilters.append(prefilt)
160 chainPartName=f
'j0_{hyposcenario}'
161 elif scenario ==
"MULT":
162 hyposcenario=f
'MULT0mult{mult}XX{cut}ptXX{etarange}'
164 chainPartName=f
'j0_{hyposcenario}'
165 log.info(f
'Generated chainPartName {chainPartName}')
167 hyposcenario=
'simple'
169 chainPartName=f
'{mult}j{cut}_{etarange}'
172 btagger = cut_dict[
'btagger']
173 bwp = cut_dict[
'bwp']
177 elif btagger ==
'bgtwo':
183 tmpChainDict = dict(preselCommonJetParts)
186 tauid = cut_dict[
"tauid"]
187 tauwp = cut_dict[
"tauwp"]
189 tmpChainDict[tauid] = tauwp+tauid
192 {
'L1threshold':
'FSNOSEED',
193 'chainPartName': chainPartName,
194 'multiplicity': mult,
195 'threshold': threshold,
199 'bsel': f
'{bwp}{btagger}' if hasBjetSel
else "",
200 'chainPartIndex': ip,
201 'hypoScenario': hyposcenario,
202 'prefilters': prefilters,
206 preselChainDict[
'chainParts'] += [tmpChainDict]
212 jetlegs =
sum([p[
'signature']
in [
"Jet",
"Bjet"]
for p
in mainChainDict[
'chainParts']])
213 padding = jetlegs-len(preselChainDict[
'chainParts'])
215 preselChainDict[
'chainParts'][-1][
'chainPartName']+=
'_SHARED'
216 preselChainDict[
'chainParts'][-1][
'tboundary']=
'SHARED'
217 dummyLegPart = dict(preselCommonJetParts)
219 {
'L1threshold':
'FSNOSEED',
220 'chainPartName':
'j0_SHARED',
224 'tboundary':
'SHARED',
227 preselChainDict[
'chainParts'] += [dict(dummyLegPart)
for i
in range(padding)]
229 preselChainDict[
'chainParts'][-1][
'chainPartName']=
'j0'
230 preselChainDict[
'chainParts'][-1][
'tboundary']=
''
235 for porig,ppresel
in zip(mainChainDict[
'chainParts'],preselChainDict[
'chainParts']):
236 for key
in [
'chainPartIndex',
'signature']:
237 ppresel[key] = porig[key]
239 assert(len(preselChainDict[
'chainParts'])==len(mainChainDict[
'chainParts']))
242 except NoHypoToolCreated
as nohypo:
244 except Exception
as e:
245 log.error(
"Failure with preselection for chain %s",mainChainDict[
'chainName'])