[5] | 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 | |
---|