65 preselChainDict = dict(mainChainDict)
66 preselChainDict[
'chainParts']=[]
71 presel_matched = re.match(
r'presel(?P<cut>\d?\d?(Z[\d\D]+)?[jacf](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\d\d|bg\d\d|bgtwo\d\d',
'', p)
97 p = re.sub(
r'gntau\d\d',
'', p)
99 hasBjetSel =
bool(re.match(
r'.*(b\d\d|bg\d\d|bgtwo\d\d)', p))
100 hasTauSel =
bool(re.match(
r'.*(gntau\d\d)', p))
101 hasDIPZsel =
bool(re.match(
r'.*Z', p))
103 if hasDIPZsel
and not doTaggingSel:
continue
104 if usingDIPZ
and not hasDIPZsel
and not hasBjetSel
and doTaggingSel:
continue
106 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."
108 pattern_to_test =
r'(?P<mult>\d?\d?)(?P<region>[jacf])'
109 pattern_to_test +=
r'(?P<scenario>(HT)?)(?P<cut>\d+)'
110 pattern_to_test +=
r'b(?P<btagger>\D*)(?P<bwp>\d+)' if hasBjetSel
else ''
111 pattern_to_test +=
r'gntau(?P<tauwp>\d\d)' if hasTauSel
else ''
112 pattern_to_test +=
r'emf(?P<emfc>\d+)' if hascalSel
else ''
113 if hasDIPZsel: pattern_to_test =
r'(?P<scenario>Z)((?P<dipzwp>\d+))?(?P<prefilt>(MAXMULT\d+[jacf]?)?)'
114 matched = re.match(pattern_to_test, p)
115 assert matched
is not None,
"Impossible to extract preselection cut for \'{0}\' substring. Please investigate.".
format(p)
116 cut_dict = matched.groupdict()
117 if hasDIPZsel: cut_dict[
'region'] =
'c'
118 if hasDIPZsel: cut_dict[
'cut'] = ptCut
123 [
"mult" ,
"emfc" ,
"cut" ,
"cut_add" ,
"prefilt"
124 ,
"bwp" ,
"btagger" ,
"dipzwp"
130 cut_dict.setdefault(k,
"")
133 mult,region,scenario,cut,btagger,bwp,dipzwp,emfc = \
134 cut_dict[
'mult'],cut_dict[
'region'],cut_dict[
'scenario'],cut_dict[
'cut'],cut_dict[
'btagger'],cut_dict[
'bwp'],cut_dict[
'dipzwp'],cut_dict[
'emfc']
136 tauwp = cut_dict[
"tauwp"]
140 if mult==
'': mult=
'1'
141 etarange = etaRangeAbbrev[region]
143 hyposcenario=f
'HT{cut}XX{etarange}'
145 chainPartName=f
'j0_{hyposcenario}'
146 elif scenario ==
"Z":
147 hyposcenario=f
'Z{dipzwp}XX{nCentralJets}c{cut}'
148 prefilt = cut_dict[
'prefilt']
149 if prefilt !=
'': prefilters.append(prefilt)
151 chainPartName=f
'j0_{hyposcenario}'
153 hyposcenario=
'simple'
155 chainPartName=f
'{mult}j{cut}_{etarange}'
159 elif btagger ==
'gtwo':
164 tmpChainDict = dict(preselCommonJetParts)
166 {
'L1threshold':
'FSNOSEED',
167 'chainPartName': chainPartName,
168 'multiplicity': mult,
169 'threshold': threshold,
173 'bsel':
'' if bwp ==
'' else f
'{bwp}b{btagger}',
174 'tausel':
"" if tauwp ==
'' else f
'{tauwp}gntau',
175 'chainPartIndex': ip,
176 'hypoScenario': hyposcenario,
177 'prefilters': prefilters,
180 preselChainDict[
'chainParts'] += [tmpChainDict]
186 jetlegs =
sum([p[
'signature']
in [
"Jet",
"Bjet"]
for p
in mainChainDict[
'chainParts']])
187 padding = jetlegs-len(preselChainDict[
'chainParts'])
189 preselChainDict[
'chainParts'][-1][
'chainPartName']+=
'_SHARED'
190 preselChainDict[
'chainParts'][-1][
'tboundary']=
'SHARED'
191 dummyLegPart = dict(preselCommonJetParts)
193 {
'L1threshold':
'FSNOSEED',
194 'chainPartName':
'j0_SHARED',
198 'tboundary':
'SHARED',
201 preselChainDict[
'chainParts'] += [dict(dummyLegPart)
for i
in range(padding)]
203 preselChainDict[
'chainParts'][-1][
'chainPartName']=
'j0'
204 preselChainDict[
'chainParts'][-1][
'tboundary']=
''
209 for porig,ppresel
in zip(mainChainDict[
'chainParts'],preselChainDict[
'chainParts']):
210 for key
in [
'chainPartIndex',
'signature']:
211 ppresel[key] = porig[key]
213 assert(len(preselChainDict[
'chainParts'])==len(mainChainDict[
'chainParts']))
216 except NoHypoToolCreated
as nohypo:
218 except Exception
as e:
219 log.error(
"Failure with preselection for chain %s",mainChainDict[
'chainName'])