Skip to content

Commit 5e378bd

Browse files
committed
few Categorizer for WeightProducer
1 parent 477b9ec commit 5e378bd

File tree

2 files changed

+161
-3
lines changed

2 files changed

+161
-3
lines changed

hbw/categorization/categories.py

+146-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from columnflow.util import maybe_import
1212
from columnflow.categorization import Categorizer, categorizer
1313
from columnflow.selection import SelectionResult
14-
from columnflow.columnar_util import has_ak_column, optional_column
14+
from columnflow.columnar_util import has_ak_column, optional_column, set_ak_column
1515

1616
from hbw.util import MET_COLUMN, BTAG_COLUMN
1717

@@ -325,3 +325,148 @@ def mask_fn_highpt(self: Categorizer, events: ak.Array, **kwargs) -> tuple[ak.Ar
325325
"""
326326
mask = (events.Lepton[:, 0].pt > 70) & (events.Lepton[:, 1].pt > 50) & (events.mll > 20)
327327
return events, mask
328+
329+
330+
@categorizer(uses={"run", "trigger_ids", "HLT.*"})
331+
def trigger_hlt(self: Categorizer, events: ak.Array, **kwargs) -> tuple[ak.Array, ak.Array]:
332+
mask = ak.zeros_like(events.run, dtype=np.bool_)
333+
for trig in events.HLT.fields:
334+
mask = mask | events.HLT[trig]
335+
return events, mask
336+
337+
338+
@categorizer(uses={"run", "trigger_steps.*"})
339+
def trigger_default(self: Categorizer, events: ak.Array, **kwargs) -> tuple[ak.Array, ak.Array]:
340+
"""
341+
Use steps for trigger selection that were not applied during the selection to mask events
342+
when creating histograms.
343+
"""
344+
mask = ak.ones_like(events.run, dtype=np.bool_)
345+
for trig_step in (
346+
"Trigger",
347+
"TriggerAndLep",
348+
"data_double_counting",
349+
):
350+
mask = mask & events.trigger_steps[trig_step]
351+
return events, mask
352+
353+
354+
@categorizer(uses={"run", "steps.*"})
355+
def default_sel(self: Categorizer, events: ak.Array, **kwargs) -> tuple[ak.Array, ak.Array]:
356+
"""
357+
Use steps for trigger selection that were not applied during the selection to mask events
358+
when creating histograms.
359+
"""
360+
mask = ak.ones_like(events.run, dtype=np.bool_)
361+
for step in (
362+
"Trigger",
363+
"TriggerAndLep",
364+
"data_double_counting",
365+
"TripleLooseLeptonVeto",
366+
"Charge",
367+
):
368+
mask = mask & events.steps[step]
369+
return events, mask
370+
371+
372+
@categorizer(uses={"run", default_sel, "steps.horn_jet_veto"})
373+
def sel_hornjets(self: Categorizer, events: ak.Array, **kwargs) -> tuple[ak.Array, ak.Array]:
374+
"""
375+
Hornjets mask (veto all events with jets in horns)
376+
"""
377+
events, mask = self[default_sel](events, **kwargs)
378+
379+
mask = mask & events.steps.horn_jet_veto
380+
381+
return events, mask
382+
383+
384+
@categorizer(uses={"run", default_sel, "steps.horn_jet_veto_leading_only"})
385+
def sel_hornjets_leading_only(self: Categorizer, events: ak.Array, **kwargs) -> tuple[ak.Array, ak.Array]:
386+
"""
387+
Hornjets mask (veto all events with jets in horns)
388+
"""
389+
events, mask = self[default_sel](events, **kwargs)
390+
391+
mask = mask & events.steps.horn_jet_veto_leading_only
392+
393+
return events, mask
394+
395+
396+
@categorizer(uses={"run", default_sel, "{Electron,Muon}.{pt,eta,phi,mass}"})
397+
def sel_barrelleps(self: Categorizer, events: ak.Array, **kwargs) -> tuple[ak.Array, ak.Array]:
398+
"""
399+
All leptons in barrel
400+
"""
401+
events, mask = self[default_sel](events, **kwargs)
402+
403+
lep_mask = ak.all(abs(events.Lepton.eta) < 1.3, axis=-1)
404+
mask = mask & lep_mask
405+
406+
return events, mask
407+
408+
409+
@categorizer(uses={"run", default_sel, "{Electron,Muon}.{pt,eta,phi,mass}"})
410+
def sel_endcapleps(self: Categorizer, events: ak.Array, **kwargs) -> tuple[ak.Array, ak.Array]:
411+
"""
412+
All leptons in endcaps
413+
"""
414+
events, mask = self[default_sel](events, **kwargs)
415+
416+
lep_mask = ak.all(abs(events.Lepton.eta) > 1.3, axis=-1)
417+
mask = mask & lep_mask
418+
419+
return events, mask
420+
421+
422+
@categorizer(uses={"run", default_sel, "Jet.pt", "Jet.eta", BTAG_COLUMN("Jet")})
423+
def sel_leadingjet30(self: Categorizer, events: ak.Array, **kwargs) -> tuple[ak.Array, ak.Array]:
424+
"""
425+
At least one b-tagged jet with pt>30
426+
"""
427+
events, mask = self[default_sel](events, **kwargs)
428+
429+
jet_mask = (
430+
(events.Jet["pt"] > 30) &
431+
(events.Jet[self.config_inst.x.btag_column] >= self.config_inst.x.btag_wp_score)
432+
)
433+
mask = mask & (ak.sum(jet_mask, axis=-1) >= 1)
434+
435+
return events, mask
436+
437+
438+
@categorizer(uses={"run", sel_leadingjet30, "Jet.pt", "Jet.eta"})
439+
def sel_jets30(self: Categorizer, events: ak.Array, **kwargs) -> tuple[ak.Array, ak.Array]:
440+
"""
441+
At least one b-tagged jet with pt>30 + all jets have pt>30
442+
"""
443+
events = set_ak_column(events, "Jet", events.Jet[events.Jet["pt"] > 30])
444+
events, mask = self[sel_leadingjet30](events, **kwargs)
445+
446+
return events, mask
447+
448+
449+
@categorizer(uses={"run", "steps.*"})
450+
def sel_loose(self: Categorizer, events: ak.Array, **kwargs) -> tuple[ak.Array, ak.Array]:
451+
"""
452+
Loose selection (no TripleLeptonVeto and no Charge at the moment)
453+
"""
454+
mask = ak.ones_like(events.run, dtype=np.bool_)
455+
for step in (
456+
"Trigger",
457+
"TriggerAndLep",
458+
"data_double_counting",
459+
):
460+
mask = mask & events.steps[step]
461+
return events, mask
462+
463+
464+
@categorizer(uses={"run", "steps.*"}, steps=[])
465+
def sel_steps(self: Categorizer, events: ak.Array, **kwargs) -> tuple[ak.Array, ak.Array]:
466+
"""
467+
Configurable Categorizer to apply a list of selection steps.
468+
"""
469+
mask = ak.ones_like(events.run, dtype=np.bool_)
470+
for step in self.steps:
471+
mask = mask & events.steps[step]
472+
return events, mask

hbw/weight/default.py

+15-2
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,20 @@ def base_init(self: WeightProducer) -> None:
264264
}})
265265

266266

267-
from hbw.categorization.categories import mask_fn_highpt
268-
267+
from hbw.categorization.categories import (
268+
mask_fn_highpt, trigger_default, trigger_hlt, default_sel, sel_loose,
269+
sel_leadingjet30, sel_jets30, sel_barrelleps, sel_endcapleps,
270+
sel_hornjets, sel_hornjets_leading_only,
271+
)
269272

270273
no_btag_weight.derive("no_btag_weight_highpt", cls_dict={"categorizer_cls": mask_fn_highpt})
274+
no_btag_weight.derive("no_btag_weight_trigger_hlt", cls_dict={"categorizer_cls": trigger_hlt})
275+
no_btag_weight.derive("no_btag_weight_trigger", cls_dict={"categorizer_cls": trigger_default})
276+
no_btag_weight.derive("no_btag_weight_sel", cls_dict={"categorizer_cls": default_sel})
277+
no_btag_weight.derive("no_btag_weight_sel_loose", cls_dict={"categorizer_cls": sel_loose})
278+
no_btag_weight.derive("no_btag_weight_sel_jets30", cls_dict={"categorizer_cls": sel_jets30})
279+
no_btag_weight.derive("no_btag_weight_sel_leadingjet30", cls_dict={"categorizer_cls": sel_leadingjet30})
280+
no_btag_weight.derive("no_btag_weight_sel_barrelleps", cls_dict={"categorizer_cls": sel_barrelleps})
281+
no_btag_weight.derive("no_btag_weight_sel_endcapleps", cls_dict={"categorizer_cls": sel_endcapleps})
282+
no_btag_weight.derive("no_btag_weight_sel_hornjets", cls_dict={"categorizer_cls": sel_hornjets})
283+
no_btag_weight.derive("no_btag_weight_sel_hornjets_leading_only", cls_dict={"categorizer_cls": sel_hornjets_leading_only}) # noqa: E501

0 commit comments

Comments
 (0)