|
11 | 11 | from columnflow.util import maybe_import
|
12 | 12 | from columnflow.categorization import Categorizer, categorizer
|
13 | 13 | 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 |
15 | 15 |
|
16 | 16 | from hbw.util import MET_COLUMN, BTAG_COLUMN
|
17 | 17 |
|
@@ -325,3 +325,148 @@ def mask_fn_highpt(self: Categorizer, events: ak.Array, **kwargs) -> tuple[ak.Ar
|
325 | 325 | """
|
326 | 326 | mask = (events.Lepton[:, 0].pt > 70) & (events.Lepton[:, 1].pt > 50) & (events.mll > 20)
|
327 | 327 | 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 |
0 commit comments