Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/object collection #22

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions CollectObject.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import numpy as np
import awkward as ak

class CollectObject:

def __init__(self, events):
self.events = events

def CreateMask(self, variable, cut):
loaded = self.objects[variable]
sign = cut[0]
value = cut[1]
if sign == "==":
self.mask = self.mask & (loaded == value)
elif sign == ">=":
self.mask = self.mask & (loaded >= value)
elif sign == ">":
self.mask = self.mask & (loaded > value)
elif sign == "<=":
self.mask = self.mask & (loaded <= value)
elif sign == "<":
self.mask = self.mask & (loaded < value)
elif sign == "!=":
self.mask = self.mask & (loaded != value)
else:
pass
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this part i am not so proud of but didn't find a way to better configure this in a generic way. any ideas?
but because dask already optimizes the pipeline, it won't disturb the computing performance too much


def Electron(self, cuts):
self.objects = self.events["Electron"]
self.mask = ak.ones_like(self.objects["pt"], dtype=bool)
for variable, cut in cuts.items():
self.CreateMask(variable, cut)
return self.objects[self.mask]
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not implemented yet but CollectObject can also take the campaign as an input and we can do

if campaign == "RunIISummer20UL18":
    mask_hem = eta < blah & phi > blah
    self.mask = self.mask & mask_hem

So we can keep all object selection issues here


def Muon(self, cuts):
self.objects = self.events["Muon"]
self.mask = ak.ones_like(self.objects["pt"], dtype=bool)
for variable, cut in cuts.items():
self.CreateMask(variable, cut)
return self.objects[self.mask]

def Tau(self, cuts):
self.objects = self.events["Tau"]
self.mask = ak.ones_like(self.objects["pt"], dtype=bool)
for variable, cut in cuts.items():
self.CreateMask(variable, cut)
return self.objects[self.mask]

def Jet(self, cuts):
self.objects = self.events["Jet"]
self.mask = ak.ones_like(self.objects["pt"], dtype=bool)
for variable, cut in cuts.items():
self.CreateMask(variable, cut)
return self.objects[self.mask]

def FatJet(self, cuts):
self.objects = self.events["FatJet"]
self.mask = ak.ones_like(self.objects["pt"], dtype=bool)
for variable, cut in cuts.items():
self.CreateMask(variable, cut)
return self.objects[self.mask]

12 changes: 10 additions & 2 deletions analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import dask.array as da
import dask_awkward as dak
from coffea.analysis_tools import PackedSelection
from CollectObject import CollectObject
import time
import re

Expand Down Expand Up @@ -175,8 +176,15 @@ def process(self, events):
# OBJECT SELECTION #
####################

# muon and electron selections are broken out into standalone functions
tightElectrons, looseElectrons = selectElectrons(events)
coll = CollectObject(events)
tightElectrons = coll.Electron({
"pt" : (">", 53),
"eta" : ("<", 2.4),
})
looseElectrons = coll.Electron({
"pt" : (">", 53),
"eta" : ("<", 2.4),
})
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just demonstrating how it could be used,
other id selections have to be implemented here as well

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if you want more userfirendly approach, we can add
"id" : "tight"
and then in the back in CollectObject, we could do something like

if id == "tight":
    id_cut = 2
elif id == "loose":
    id_cut = 1
...
mask = electron.id > id_cut

but maybe not worth it? not sure

nTightElectrons = ak.num(tightElectrons)

tightMuons, looseMuons = selectMuons(events)
Expand Down