@@ -38,17 +38,22 @@ function main_looper(mytree, sumWeight, dict, pusher!, models,
38
38
model = models # for BDT
39
39
for evt in mytree
40
40
# ## initial_cut
41
- cutflow_ptr = 0
42
- if NN_hist pusher! (dict[:CutFlow ], cutflow_ptr) end
41
+ cutflow_ptr = Ref (1 )
42
+ if NN_hist pusher! (dict[:CutFlow ], cutflow_ptr[]) end
43
+
44
+ ! (evt. passTrig) && continue
45
+ cutflow_ptr[] += 1
46
+ if NN_hist pusher! (dict[:CutFlow ], cutflow_ptr[]) end
47
+
43
48
v_m_eta_orig, v_e_caloeta_orig = evt. v_m_eta, evt. v_e_caloeta
44
49
e_etamask = [abs (η) < 2.47 && (abs (η)< 1.37 || abs (η)> 1.52 ) for η in v_e_caloeta_orig]
45
50
m_etamask = [abs (η) < 2.5 for η in v_m_eta_orig]
46
51
v_l_pid = @views Vcat (evt. v_e_pid[e_etamask], evt. v_m_pid[m_etamask])
47
-
48
52
Nlep = length (v_l_pid)
49
53
Nlep != 4 && continue
50
- cutflow_ptr += 1
51
- if NN_hist pusher! (dict[:CutFlow ], cutflow_ptr) end
54
+ cutflow_ptr[] += 1
55
+ if NN_hist pusher! (dict[:CutFlow ], cutflow_ptr[]) end
56
+
52
57
Nelec = count (e_etamask)
53
58
Nmuon = Nlep - Nelec
54
59
(; v_e_pt, v_e_eta, v_e_phi,
@@ -61,65 +66,61 @@ function main_looper(mytree, sumWeight, dict, pusher!, models,
61
66
v_e_tlv = @views LorentzVectorCyl .(v_e_pt[e_etamask], v_e_eta[e_etamask], v_e_phi[e_etamask], v_e_m[e_etamask])
62
67
v_m_tlv = @views LorentzVectorCyl .(v_m_pt[m_etamask], v_m_eta[m_etamask], v_m_phi[m_etamask], v_m_m[m_etamask])
63
68
v_l_tlv = Vcat (v_e_tlv, v_m_tlv)
69
+
64
70
Z_pair, W_pair, best_Z_mass = Find_Z_Pairs (v_l_pid, v_l_tlv)
65
71
isinf (best_Z_mass) && continue
66
- cutflow_ptr += 1
67
- if NN_hist pusher! (dict[:CutFlow ], cutflow_ptr) end
68
72
other_mass = mass (v_l_tlv[W_pair[1 ]] + v_l_tlv[W_pair[2 ]])
69
73
abs (best_Z_mass - Z_m) > 20 && continue
70
- cutflow_ptr += 1
71
- if NN_hist pusher! (dict[:CutFlow ], cutflow_ptr) end
74
+ cutflow_ptr[] += 1
75
+ if NN_hist pusher! (dict[:CutFlow ], cutflow_ptr[]) end
76
+
72
77
mass_4l = mass (sum (v_l_tlv))
73
78
mass_4l < 0.0 && continue
74
- cutflow_ptr += 1
75
- if NN_hist pusher! (dict[:CutFlow ], cutflow_ptr) end
76
79
# ## end of initial_cut
77
- ! (evt. passTrig) && continue
78
- cutflow_ptr += 1
79
- if NN_hist pusher! (dict[:CutFlow ], cutflow_ptr) end
80
+
80
81
v_l_order = sortperm (v_l_tlv; by= pt, rev= true )
81
- v_l_medium = @views Vcat (evt. v_e_LHMedium[e_etamask] , evt. v_m_medium[m_etamask]) # quality
82
82
83
- # ############# use PLIV for W lepton ISO #################
84
- v_l_PLTight = Vcat (evt. v_e_passIso_PLImprovedTight[e_etamask], evt. v_m_passIso_PLImprovedTight[m_etamask])
85
- # if controlregion == :Zjets
86
- # failed_PLTight = any(==(true), v_l_PLTight[W_pair])
87
- # failed_PLTight && continue
88
- # v_l_Loose = Vcat(evt.v_e_passIso_Loose_VarRad, evt.v_m_passIso_PflowLoose_VarRad)
89
- # failed_Loose = all(==(true), v_l_Loose[W_pair])
90
- # failed_Loose && continue
91
- # else
92
- failed_PLTight = any (== (false ), v_l_PLTight[W_pair])
93
- failed_PLTight && continue
94
- cutflow_ptr += 1
95
- if NN_hist pusher! (dict[:CutFlow ], cutflow_ptr) end
96
- # end
97
- (;
98
- v_e_passIso_Loose_VarRad,
99
- v_m_passIso_PflowLoose_VarRad,
100
- ) = evt
83
+ # ## QUALITY
84
+ v_l_medium = @views Vcat (evt. v_e_LHMedium[e_etamask] , evt. v_m_medium[m_etamask])
85
+ # for W leptons, require medium quality
86
+ ! v_l_medium[W_pair[1 ]] && continue
87
+ ! v_l_medium[W_pair[2 ]] && continue
88
+ # for Z leptons only Loose requirement, no additional quality cut
89
+ #
90
+ cutflow_ptr[] += 1
91
+ if NN_hist pusher! (dict[:CutFlow ], cutflow_ptr[]) end
92
+
93
+ # ## ISOLATION
94
+ # for W leptons, require PLIVTight Isolation
95
+ v_l_PLTight = @views Vcat (evt. v_e_passIso_PLImprovedTight[e_etamask], evt. v_m_passIso_PLImprovedTight[m_etamask])
96
+ ! v_l_PLTight[W_pair[1 ]] && continue
97
+ ! v_l_PLTight[W_pair[2 ]] && continue
98
+ # for Z leptons require Loose isolation
99
+ (;v_e_passIso_Loose_VarRad, v_m_passIso_PflowLoose_VarRad) = evt
101
100
v_l_passIso = @views Vcat (v_e_passIso_Loose_VarRad[e_etamask], v_m_passIso_PflowLoose_VarRad[m_etamask])
101
+ ! v_l_passIso[Z_pair[1 ]] && continue
102
+ ! v_l_passIso[Z_pair[2 ]] && continue
103
+
104
+ cutflow_ptr[] += 1
105
+ if NN_hist pusher! (dict[:CutFlow ], cutflow_ptr[]) end
106
+
102
107
103
108
pass_WWZ_cut, chisq, W_id = WWZ_Cut (
104
109
Z_pair,
105
110
W_pair,
106
111
v_l_pid,
107
112
v_l_order,
108
- v_l_tlv
113
+ v_l_tlv,
114
+ dict,
115
+ cutflow_ptr,
116
+ NN_hist
109
117
)
110
- for i in 1 : 2
111
- # ## for Z leptons isolation: Loose(e) and Loose(mu)
112
- ! v_l_passIso[Z_pair[i]] && (pass_WWZ_cut = false )
113
-
114
- # ## for W leptons, require medium quality and PLIV tight
115
- ! v_l_medium[W_pair[i]] && (pass_WWZ_cut = false )
116
- end
117
118
118
119
! pass_WWZ_cut && continue
119
- cutflow_ptr += 1
120
- if NN_hist pusher! (dict[:CutFlow ], cutflow_ptr) end
121
120
122
121
has_b = any (evt. v_j_btag77)
122
+ cutflow_ptr[] += 1
123
+ if ! has_b && NN_hist pusher! (dict[:CutFlow ], cutflow_ptr[]) end
123
124
124
125
(; MET, METSig, METPhi) = evt
125
126
MET /= 1000
@@ -133,7 +134,7 @@ function main_looper(mytree, sumWeight, dict, pusher!, models,
133
134
make_sfsys_wgt! (evt, wgt_dict,
134
135
:weight ; sfsys, pre_mask= 1 )
135
136
make_sfsys_wgt! (evt, wgt_dict,
136
- :v_j_wgt_btag77 , : ; sfsys)
137
+ :v_j_wgt_btag77 , Colon () ; sfsys)
137
138
# I hate indexing
138
139
Z_pair_in_e = filter (<= (Nelec), Z_pair)
139
140
Z_pair_in_m = filter! (> (0 ), Z_pair .- Nelec)
@@ -162,14 +163,12 @@ function main_looper(mytree, sumWeight, dict, pusher!, models,
162
163
make_sfsys_wgt! (evt, wgt_dict,
163
164
:v_m_wgtIso_PflowLoose_VarRad ,
164
165
Z_pair_in_m; pre_mask = m_etamask, sfsys)
165
- # if controlregion != :ZJets
166
- make_sfsys_wgt! (evt, wgt_dict,
167
- :v_e_wgtIso_PLImprovedTight_Medium ,
168
- W_pair_in_e; pre_mask = e_etamask, sfsys)
169
- make_sfsys_wgt! (evt, wgt_dict,
170
- :v_m_wgtIso_PLImprovedTight ,
171
- W_pair_in_m; pre_mask = m_etamask, sfsys)
172
- # end
166
+ make_sfsys_wgt! (evt, wgt_dict,
167
+ :v_e_wgtIso_PLImprovedTight_Medium ,
168
+ W_pair_in_e; pre_mask = e_etamask, sfsys)
169
+ make_sfsys_wgt! (evt, wgt_dict,
170
+ :v_m_wgtIso_PLImprovedTight ,
171
+ W_pair_in_m; pre_mask = m_etamask, sfsys)
173
172
end
174
173
175
174
lep1_pid, lep2_pid, lep3_pid, lep4_pid = @view v_l_pid[v_l_order]
@@ -238,6 +237,8 @@ function main_looper(mytree, sumWeight, dict, pusher!, models,
238
237
if cr_ZZ || cr_ttZ
239
238
SR = - 1
240
239
end
240
+ cutflow_ptr[] += 1
241
+ if MET> 10 && NN_hist pusher! (dict[:CutFlow ], cutflow_ptr[]) end
241
242
242
243
if NN_hist && ! arrow_making
243
244
region_prefix = if sr_SF_inZ
@@ -256,9 +257,7 @@ function main_looper(mytree, sumWeight, dict, pusher!, models,
256
257
elseif cr_ttZ
257
258
pusher! (dict[Symbol (:ttZCR , :__Njet , :__ , k)], Njet, v)
258
259
elseif SR >= 0
259
- cutflow_ptr += 1
260
- pusher! (dict[:CutFlow ], cutflow_ptr)
261
- pusher! (dict[Symbol (region_prefix, :__NN , :__ , k)], NN_score, v)
260
+ pusher! (dict[Symbol (region_prefix, :__BDT , :__ , k)], NN_score, v)
262
261
pusher! (dict[Symbol (region_prefix, :__MET , :__ , k)], MET, v)
263
262
pusher! (dict[Symbol (region_prefix, :__Njet , :__ , k)], Njet, v)
264
263
end
0 commit comments