TTTT Analysis  0.1
selection.hpp
Go to the documentation of this file.
1 
34 #ifndef SELECTION_HPP
35 #define SELECTION_HPP
36 
37 #include <vector>
38 
39 #include "filval/filval.hpp"
40 #include "filval_root/filval_root.hpp"
41 
42 #include "analysis/common/obj_types.hpp"
43 
44 struct EventSelection{
45  ObsFilter* trilepton;
46  ObsFilter* b_jet3;
47  ObsFilter* z_mass_veto;
48 
49  ObsFilter* base_sel;
50 
51  ObsFilter* J4;
52  ObsFilter* J5;
53  ObsFilter* J6;
54 
55  ObsFilter* SR4j;
56  ObsFilter* SR5j;
57  ObsFilter* SR6j;
58 };
59 
60 EventSelection event_selection;
61 
62 void init_selection(){
63  auto leptons = lookup<std::vector<Particle>>("leptons");
64  auto jets = lookup<std::vector<Particle>>("jets");
65 
66  // Require *exactly* three charged leptons
67  event_selection.trilepton = obs_filter("trilepton",GenFunction::register_function<bool()>("trilepton",
68  FUNC(([leptons](){
69  return leptons->get_value().size() == 3;
70  }))));
71 
72  // Require at least three b-jets
73  event_selection.b_jet3 = obs_filter("b_jet3",GenFunction::register_function<bool()>("b_jet3",
74  FUNC(([jets](){
75  int n_b_jets = 0;
76  for(auto jet : jets->get_value()){
77  if(jet.tag == Particle::JET && jet.jet.b_cmva > 0)
78  n_b_jets++;
79  }
80  return n_b_jets >= 3;
81  }))));
82 
83  // Require all same-flavour OS dilepton combinations are outside the Z mass
84  // window (70,105)
85  event_selection.z_mass_veto = obs_filter("z_mass_veto",GenFunction::register_function<bool()>("z_mass_veto",
86  FUNC(([leptons](){
87  auto& leps = leptons->get_value();
88  int n = leps.size();
89  for(int i = 0; i < n; i++){
90  for(int j = i+1; j < n; j++){
91  const Particle& p1 = leps[i];
92  const Particle& p2 = leps[j];
93  if(abs(p1.lepton.pdg_id) != abs(p2.lepton.pdg_id)) continue;
94  if(p1.lepton.charge == p2.lepton.charge) continue;
95  double m = (p1.v + p2.v).M();
96  if(70 < m && m < 105)
97  return false;
98  }
99  }
100  return true;
101  }))));
102 
103 
104  event_selection.J4 = obs_filter("4jet_selection",GenFunction::register_function<bool()>("4jet_selection",
105  FUNC(([jets](){
106  return jets->get_value().size() >= 4;
107  }))));
108 
109  event_selection.J5 = obs_filter("5jet_selection",GenFunction::register_function<bool()>("5jet_selection",
110  FUNC(([jets](){
111  return jets->get_value().size() >= 5;
112  }))));
113 
114  event_selection.J6 = obs_filter("6jet_selection",GenFunction::register_function<bool()>("6jet_selection",
115  FUNC(([jets](){
116  return jets->get_value().size() >= 6;
117  }))));
118 
119  event_selection.base_sel = ObsFilter::conj(event_selection.z_mass_veto, ObsFilter::conj(event_selection.trilepton, event_selection.b_jet3));
120  event_selection.SR4j = ObsFilter::conj(event_selection.base_sel, event_selection.J4);
121  event_selection.SR5j = ObsFilter::conj(event_selection.base_sel, event_selection.J5);
122  event_selection.SR6j = ObsFilter::conj(event_selection.base_sel, event_selection.J6);
123 }
124 #endif // SELECTION_HPP