29
29
from hbw .production .weights import event_weights_to_normalize , large_weights_killer
30
30
from hbw .selection .stats import hbw_selection_step_stats , hbw_increment_stats
31
31
from hbw .selection .cutflow_features import cutflow_features
32
- from hbw .util import four_vec
32
+ from hbw .util import four_vec , call_once_on_config
33
33
34
34
np = maybe_import ("numpy" )
35
35
ak = maybe_import ("awkward" )
@@ -84,6 +84,11 @@ def jet_selection(
84
84
events = set_ak_column (events , "local_index" , ak .local_index (events .Jet ))
85
85
86
86
# default jet definition
87
+ jet_mask_loose = (
88
+ (events .Jet .pt >= 25 ) &
89
+ (abs (events .Jet .eta ) <= 2.4 ) &
90
+ (events .Jet .jetId >= 2 ) # 1: loose, 2: tight, 4: isolated, 6: tight+isolated
91
+ )
87
92
jet_mask = (
88
93
(events .Jet .pt >= 25 ) &
89
94
(abs (events .Jet .eta ) <= 2.4 ) &
@@ -99,6 +104,9 @@ def jet_selection(
99
104
# get the jet indices for pt-sorting of jets
100
105
jet_indices = masked_sorted_indices (jet_mask , events .Jet .pt )
101
106
107
+ steps ["nJetReco1" ] = ak .num (events .Jet ) >= 1
108
+ steps ["nJetLoose1" ] = ak .sum (jet_mask_loose , axis = 1 ) >= 1
109
+
102
110
# add jet steps
103
111
events = set_ak_column (events , "cutflow.n_jet" , ak .sum (jet_mask , axis = 1 ))
104
112
steps ["nJet1" ] = events .cutflow .n_jet >= 1
@@ -142,6 +150,13 @@ def jet_selection(
142
150
143
151
@jet_selection .init
144
152
def jet_selection_init (self : Selector ) -> None :
153
+ # Add shift dependencies
154
+ self .shifts |= {
155
+ shift_inst .name
156
+ for shift_inst in self .config_inst .shifts
157
+ if shift_inst .has_tag (("jec" , "jer" ))
158
+ }
159
+
145
160
# set the main b_tagger + working point as defined from the selector
146
161
self .config_inst .x .b_tagger = self .b_tagger
147
162
self .config_inst .x .btag_wp = self .btag_wp
@@ -169,22 +184,24 @@ def jet_selection_init(self: Selector) -> None:
169
184
self .produces .add ("cutflow.n_jet" )
170
185
self .produces .add ("cutflow.n_btag" )
171
186
172
- # create variable instances
173
- self .config_inst .add_variable (
174
- name = "cf_n_jet" ,
175
- expression = "cutflow.n_jet" ,
176
- binning = (7 , - 0.5 , 6.5 ),
177
- x_title = "Number of jets" ,
178
- discrete_x = True ,
179
- )
180
- self .config_inst .add_variable (
181
- name = "cf_n_btag" ,
182
- expression = "cutflow.n_btag" ,
183
- binning = (7 , - 0.5 , 6.5 ),
184
- x_title = f"Number of b-tagged jets ({ self .b_tagger } , { self .btag_wp } WP)" ,
185
- discrete_x = True ,
186
- )
187
-
187
+ @call_once_on_config
188
+ def add_jet_cutflow_variables (config : od .Config ):
189
+ config .add_variable (
190
+ name = "cf_n_jet" ,
191
+ expression = "cutflow.n_jet" ,
192
+ binning = (7 , - 0.5 , 6.5 ),
193
+ x_title = "Number of jets" ,
194
+ discrete_x = True ,
195
+ )
196
+ config .add_variable (
197
+ name = "cf_n_btag" ,
198
+ expression = "cutflow.n_btag" ,
199
+ binning = (7 , - 0.5 , 6.5 ),
200
+ x_title = f"Number of b-tagged jets ({ self .b_tagger } , { self .btag_wp } WP)" ,
201
+ discrete_x = True ,
202
+ )
203
+
204
+ add_jet_cutflow_variables (self .config_inst )
188
205
189
206
@selector (
190
207
uses = (
@@ -295,21 +312,25 @@ def lepton_definition(
295
312
(electron .convVeto ) &
296
313
(electron .lostHits == 0 ) &
297
314
((electron .mvaTTH >= 0.30 ) | (electron .mvaIso_WP90 )) &
298
- (ak .all (electron .matched_jet [btag_column ] <= btag_wp_score , axis = 1 )) &
315
+ (
316
+ ((electron .mvaTTH < 0.30 ) & (electron .matched_jet [btag_column ] <= btag_tight_score )) |
317
+ ((electron .mvaTTH >= 0.30 ) & (electron .matched_jet [btag_column ] <= btag_wp_score ))
318
+ ) &
319
+ (electron .matched_jet [btag_column ] <= btag_wp_score ) &
299
320
((electron .mvaTTH >= 0.30 ) | (electron .jetRelIso < 0.70 ))
300
321
)
301
322
302
323
mu_mask_fakeable = (
303
324
mu_mask_loose &
304
325
(muon .cone_pt >= 10 ) &
305
326
(
306
- ((muon .mvaTTH < 0.30 ) & (ak . all ( muon .matched_jet [btag_column ] <= btag_tight_score , axis = 1 ) )) |
307
- ((muon .mvaTTH >= 0.30 ) & (ak . all ( muon .matched_jet [btag_column ] <= btag_wp_score , axis = 1 ) ))
327
+ ((muon .mvaTTH < 0.50 ) & (muon .matched_jet [btag_column ] <= btag_tight_score )) |
328
+ ((muon .mvaTTH >= 0.50 ) & (muon .matched_jet [btag_column ] <= btag_wp_score ))
308
329
) &
309
330
# missing: DeepJet of nearby jet
310
331
((muon .mvaTTH >= 0.50 ) | (muon .jetRelIso < 0.80 ))
311
332
)
312
- from hbw . util import debugger ; debugger ()
333
+
313
334
# tight masks
314
335
e_mask_tight = (
315
336
e_mask_fakeable &
@@ -451,6 +472,22 @@ def vbf_jet_selection(
451
472
)
452
473
453
474
475
+ @vbf_jet_selection .init
476
+ def vbf_jet_selection_init (self : Selector ) -> None :
477
+ # Add shift dependencies
478
+ self .shifts |= {
479
+ shift_inst .name
480
+ for shift_inst in self .config_inst .shifts
481
+ if shift_inst .has_tag (("jec" , "jer" ))
482
+ }
483
+
484
+ # update selector step labels
485
+ self .config_inst .x .selector_step_labels = self .config_inst .x ("selector_step_labels" , {})
486
+ self .config_inst .x .selector_step_labels .update ({
487
+ "VBFJetPair" : r"$N_{VBFJetPair}^{AK4} \geq 1$" ,
488
+ })
489
+
490
+
454
491
@selector (
455
492
uses = (
456
493
four_vec (
@@ -461,6 +498,7 @@ def vbf_jet_selection(
461
498
)
462
499
),
463
500
produces = (
501
+ # NOTE: we should only produce them when cutflow is required
464
502
{"cutflow.n_fatjet" , "cutflow.n_hbbjet" } |
465
503
four_vec (
466
504
{"FatJet" , "HbbJet" },
@@ -581,6 +619,22 @@ def sl_boosted_jet_selection(
581
619
)
582
620
583
621
622
+ @sl_boosted_jet_selection .init
623
+ def sl_boosted_jet_selection_init (self : Selector ) -> None :
624
+ # Add shift dependencies
625
+ self .shifts |= {
626
+ shift_inst .name
627
+ for shift_inst in self .config_inst .shifts
628
+ if shift_inst .has_tag (("jec" , "jer" ))
629
+ }
630
+
631
+ # update selector step labels
632
+ self .config_inst .x .selector_step_labels = self .config_inst .x ("selector_step_labels" , {})
633
+ self .config_inst .x .selector_step_labels .update ({
634
+ "HbbJet" : r"$N_{H \rightarrow bb}^{AK8} \geq 1$" ,
635
+ })
636
+
637
+
584
638
# boosted selection for the DL channel (only one parameter needs to be changed)
585
639
dl_boosted_jet_selection = sl_boosted_jet_selection .derive (
586
640
"dl_boosted_jet_selection" ,
0 commit comments