[ae1d49f] | 1 | from itertools import combinations
|
---|
| 2 |
|
---|
| 3 | def jetSelection(event, ptcut=20., etacut=2.4):
|
---|
| 4 | def jetfilter(jet): return jet.PT>ptcut and abs(jet.Eta)<etacut
|
---|
| 5 | return filter(jetfilter,event.jets)
|
---|
| 6 |
|
---|
| 7 | def bjets(event):
|
---|
| 8 | def jetfilter(jet): return jet.BTag
|
---|
| 9 | return filter(jetfilter,event.selectedJets)
|
---|
| 10 |
|
---|
| 11 | def ljets(event):
|
---|
| 12 | def jetfilter(jet): return jet.BTag==0
|
---|
| 13 | return filter(jetfilter,event.selectedJets)
|
---|
| 14 |
|
---|
| 15 | def topCandidates(event,leptonic=True,hadronic=True):
|
---|
| 16 | electrons = event.electrons
|
---|
| 17 | muons = event.muons
|
---|
| 18 | ljets = event.lJets
|
---|
| 19 | bjets = event.bJets
|
---|
| 20 | met = event.MEt[0]
|
---|
| 21 | output = []
|
---|
| 22 | # leptonic top candidates: lepton + bjet + MET
|
---|
| 23 | if leptonic and not hadronic:
|
---|
| 24 | # build all combinations
|
---|
| 25 | for b in bjets:
|
---|
| 26 | for l in electrons:
|
---|
| 27 | output.append( (l,b,met) )
|
---|
| 28 | for l in muons:
|
---|
| 29 | output.append( (l,b,met) )
|
---|
| 30 | # no specific order
|
---|
| 31 | return output
|
---|
| 32 | # hadronic top candidates: 2 jets + bjet
|
---|
| 33 | if hadronic and not leptonic:
|
---|
| 34 | # build all combinations
|
---|
| 35 | for j in combinations(ljets,2):
|
---|
| 36 | for b in bjets:
|
---|
| 37 | output.append( (j[0], j[1], b) )
|
---|
| 38 | # order by distance to top mass
|
---|
| 39 | def massDistance(top):
|
---|
| 40 | mass = (top[0].P4()+top[1].P4()+top[2].P4()).M()
|
---|
| 41 | return abs(mass-172.9)
|
---|
| 42 | return sorted(output,key=massDistance)
|
---|
| 43 | # full event reconstruction
|
---|
| 44 | if hadronic and leptonic:
|
---|
| 45 | # build all combinations
|
---|
| 46 | for j in combinations(ljets,2):
|
---|
| 47 | for b in combinations(bjets,2):
|
---|
| 48 | for l in electrons:
|
---|
| 49 | output.append( (j[0], j[1], b[0], l, b[1], met) )
|
---|
| 50 | for l in muons:
|
---|
| 51 | output.append( (j[0], j[1], b[0], l, b[1], met) )
|
---|
| 52 | # find the best ones: order via hadronic top mass
|
---|
| 53 | def massDistance(top):
|
---|
| 54 | mass = (top[0].P4()+top[1].P4()+top[2].P4()).M()
|
---|
| 55 | return abs(mass-172.9)
|
---|
| 56 | return sorted(output,key=massDistance)
|
---|
| 57 |
|
---|