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 |
|
---|