3 from AthenaCommon.Logging
import logging
4 log = logging.getLogger(__name__)
8 from .JetRecoCommon
import getJetCalibDefaultString, jetChainParts, etaRangeAbbrev, jetRecoDictToString
9 from ..Menu.SignatureDicts
import JetChainParts_Default
10 from TriggerMenuMT.HLT.Config.ControlFlow.HLTCFTools
import NoHypoToolCreated
13 from TrigHLTJetHypo.TrigJetHypoToolConfig
import trigJetHypoToolFromDict
28 ''' #Here you can set custom calibrations for large-R preselections. If you set to LCW you'll get an issue though, as the trigger expects the *same* topocluster collection to be used in the preselection and in the PFlow stage with tracking. Therefore this would need to be adapted, but it might not be so easy...
30 if preselRecoDict['recoAlg']=='a10': #Setting LC calibrations for large-R jets
31 preselRecoDict['clusterCalib']='lcw'
33 preselRecoDict.update({
34 'jetCalib':
getJetCalibDefaultString(preselRecoDict[
'recoAlg'],preselRecoDict[
'constitType'],preselRecoDict[
'clusterCalib'])
35 if preselRecoDict[
'recoAlg']==
'a4' else 'nojcalib'
39 if roiftf: preselRecoDict[
'trkopt'] =
'roiftf'
49 return jparts[-1][
'trkpresel']
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'])