MA5SandBox: atlas_susy_2018_32.cpp

File atlas_susy_2018_32.cpp, 18.9 KB (added by Benjamin Fuks, 4 years ago)
Line 
1#include "SampleAnalyzer/User/Analyzer/atlas_susy_2018_32.h"
2using namespace MA5;
3using namespace std;
4
5template<typename T1, typename T2> std::vector<const T1*>
6 Removal(std::vector<const T1*>&, std::vector<const T2*>&, const MAdouble64 &);
7
8// -----------------------------------------------------------------------------
9// Initialize
10// function called one time at the beginning of the analysis
11// -----------------------------------------------------------------------------
12bool atlas_susy_2018_32::Initialize(const MA5::Configuration& cfg, const std::map<std::string,std::string>& parameters)
13{
14
15 INFO << " <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>" << endmsg;
16 INFO << " <> Analysis : ATLAS-SUSY-2018-32, arXiv:1908.08215 <>" << endmsg;
17 INFO << " <> (Ewkinos/sleptons: dilepton) <>" << endmsg;
18 INFO << " <> Recaster : J.Y. Araz, B. Fuks <>" << endmsg;
19 INFO << " <> Contact : jack.araz@durham.ac.uk, fuks@lpthe.jussieu.fr <>" << endmsg;
20 INFO << " <> <>" << endmsg;
21 INFO << " <> Based on MadAnalysis 5 v1.8 <>" << endmsg;
22 INFO << " <> DOI: XX.YYYY/ZZZ <>" << endmsg;
23 INFO << " <> <>" << endmsg;
24 INFO << " <> For more information, see <>" << endmsg;
25 INFO << " <> http://madanalysis.irmp.ucl.ac.be/wiki/PublicAnalysisDatabase <>" << endmsg;
26 INFO << " <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>" << endmsg;
27
28 // Declaration of the signal regions
29 Manager()->AddRegionSelection("SR_DF_0J_MT2_100_105");
30 Manager()->AddRegionSelection("SR_DF_0J_MT2_105_110");
31 Manager()->AddRegionSelection("SR_DF_0J_MT2_110_120");
32 Manager()->AddRegionSelection("SR_DF_0J_MT2_120_140");
33 Manager()->AddRegionSelection("SR_DF_0J_MT2_140_160");
34 Manager()->AddRegionSelection("SR_DF_0J_MT2_160_180");
35 Manager()->AddRegionSelection("SR_DF_0J_MT2_180_220");
36 Manager()->AddRegionSelection("SR_DF_0J_MT2_220_260");
37 Manager()->AddRegionSelection("SR_DF_0J_MT2_260_inf");
38 Manager()->AddRegionSelection("SR_DF_0J_MT2_100_inf");
39 Manager()->AddRegionSelection("SR_DF_0J_MT2_160_inf");
40 Manager()->AddRegionSelection("SR_DF_0J_MT2_100_120");
41 Manager()->AddRegionSelection("SR_DF_0J_MT2_120_160");
42
43 Manager()->AddRegionSelection("SR_DF_1J_MT2_100_105");
44 Manager()->AddRegionSelection("SR_DF_1J_MT2_105_110");
45 Manager()->AddRegionSelection("SR_DF_1J_MT2_110_120");
46 Manager()->AddRegionSelection("SR_DF_1J_MT2_120_140");
47 Manager()->AddRegionSelection("SR_DF_1J_MT2_140_160");
48 Manager()->AddRegionSelection("SR_DF_1J_MT2_160_180");
49 Manager()->AddRegionSelection("SR_DF_1J_MT2_180_220");
50 Manager()->AddRegionSelection("SR_DF_1J_MT2_220_260");
51 Manager()->AddRegionSelection("SR_DF_1J_MT2_260_inf");
52 Manager()->AddRegionSelection("SR_DF_1J_MT2_100_inf");
53 Manager()->AddRegionSelection("SR_DF_1J_MT2_160_inf");
54 Manager()->AddRegionSelection("SR_DF_1J_MT2_100_120");
55 Manager()->AddRegionSelection("SR_DF_1J_MT2_120_160");
56
57 Manager()->AddRegionSelection("SR_SF_0J_MT2_100_105");
58 Manager()->AddRegionSelection("SR_SF_0J_MT2_105_110");
59 Manager()->AddRegionSelection("SR_SF_0J_MT2_110_120");
60 Manager()->AddRegionSelection("SR_SF_0J_MT2_120_140");
61 Manager()->AddRegionSelection("SR_SF_0J_MT2_140_160");
62 Manager()->AddRegionSelection("SR_SF_0J_MT2_160_180");
63 Manager()->AddRegionSelection("SR_SF_0J_MT2_180_220");
64 Manager()->AddRegionSelection("SR_SF_0J_MT2_220_260");
65 Manager()->AddRegionSelection("SR_SF_0J_MT2_260_inf");
66 Manager()->AddRegionSelection("SR_SF_0J_MT2_100_inf");
67 Manager()->AddRegionSelection("SR_SF_0J_MT2_160_inf");
68 Manager()->AddRegionSelection("SR_SF_0J_MT2_100_120");
69 Manager()->AddRegionSelection("SR_SF_0J_MT2_120_160");
70
71 Manager()->AddRegionSelection("SR_SF_1J_MT2_100_105");
72 Manager()->AddRegionSelection("SR_SF_1J_MT2_105_110");
73 Manager()->AddRegionSelection("SR_SF_1J_MT2_110_120");
74 Manager()->AddRegionSelection("SR_SF_1J_MT2_120_140");
75 Manager()->AddRegionSelection("SR_SF_1J_MT2_140_160");
76 Manager()->AddRegionSelection("SR_SF_1J_MT2_160_180");
77 Manager()->AddRegionSelection("SR_SF_1J_MT2_180_220");
78 Manager()->AddRegionSelection("SR_SF_1J_MT2_220_260");
79 Manager()->AddRegionSelection("SR_SF_1J_MT2_260_inf");
80 Manager()->AddRegionSelection("SR_SF_1J_MT2_100_inf");
81 Manager()->AddRegionSelection("SR_SF_1J_MT2_160_inf");
82 Manager()->AddRegionSelection("SR_SF_1J_MT2_100_120");
83 Manager()->AddRegionSelection("SR_SF_1J_MT2_120_160");
84
85 // Declaration of the preselection cuts
86 Manager()->AddCut("OS dilep. with $p^l_T>25$ [GeV]");
87 Manager()->AddCut("$m_{l_1,l_2}>25$ [GeV]");
88 Manager()->AddCut("b veto");
89
90 // SF vs DF and Njet cuts
91 std::string SF[] = { "SR_SF_0J_MT2_100_105", "SR_SF_0J_MT2_105_110",
92 "SR_SF_0J_MT2_110_120", "SR_SF_0J_MT2_120_140", "SR_SF_0J_MT2_140_160",
93 "SR_SF_0J_MT2_160_180", "SR_SF_0J_MT2_180_220", "SR_SF_0J_MT2_220_260",
94 "SR_SF_0J_MT2_260_inf", "SR_SF_0J_MT2_100_inf", "SR_SF_0J_MT2_160_inf",
95 "SR_SF_0J_MT2_100_120", "SR_SF_0J_MT2_120_160", "SR_SF_1J_MT2_100_105",
96 "SR_SF_1J_MT2_105_110", "SR_SF_1J_MT2_110_120", "SR_SF_1J_MT2_120_140",
97 "SR_SF_1J_MT2_140_160", "SR_SF_1J_MT2_160_180", "SR_SF_1J_MT2_180_220",
98 "SR_SF_1J_MT2_220_260", "SR_SF_1J_MT2_260_inf", "SR_SF_1J_MT2_100_inf",
99 "SR_SF_1J_MT2_160_inf", "SR_SF_1J_MT2_100_120", "SR_SF_1J_MT2_120_160" };
100 std::string DF[] = { "SR_DF_0J_MT2_100_105", "SR_DF_0J_MT2_105_110",
101 "SR_DF_0J_MT2_110_120", "SR_DF_0J_MT2_120_140", "SR_DF_0J_MT2_140_160",
102 "SR_DF_0J_MT2_160_180", "SR_DF_0J_MT2_180_220", "SR_DF_0J_MT2_220_260",
103 "SR_DF_0J_MT2_260_inf", "SR_DF_0J_MT2_100_inf", "SR_DF_0J_MT2_160_inf",
104 "SR_DF_0J_MT2_100_120", "SR_DF_0J_MT2_120_160", "SR_DF_1J_MT2_100_105",
105 "SR_DF_1J_MT2_105_110", "SR_DF_1J_MT2_110_120", "SR_DF_1J_MT2_120_140",
106 "SR_DF_1J_MT2_140_160", "SR_DF_1J_MT2_160_180", "SR_DF_1J_MT2_180_220",
107 "SR_DF_1J_MT2_220_260", "SR_DF_1J_MT2_260_inf", "SR_DF_1J_MT2_100_inf",
108 "SR_DF_1J_MT2_160_inf", "SR_DF_1J_MT2_100_120", "SR_DF_1J_MT2_120_160" };
109
110 std::string SF0J[] = { "SR_SF_0J_MT2_100_105", "SR_SF_0J_MT2_105_110",
111 "SR_SF_0J_MT2_110_120", "SR_SF_0J_MT2_120_140", "SR_SF_0J_MT2_140_160",
112 "SR_SF_0J_MT2_160_180", "SR_SF_0J_MT2_180_220", "SR_SF_0J_MT2_220_260",
113 "SR_SF_0J_MT2_260_inf", "SR_SF_0J_MT2_100_inf", "SR_SF_0J_MT2_160_inf",
114 "SR_SF_0J_MT2_100_120", "SR_SF_0J_MT2_120_160"};
115 std::string SF1J[] = { "SR_SF_1J_MT2_100_105",
116 "SR_SF_1J_MT2_105_110", "SR_SF_1J_MT2_110_120", "SR_SF_1J_MT2_120_140",
117 "SR_SF_1J_MT2_140_160", "SR_SF_1J_MT2_160_180", "SR_SF_1J_MT2_180_220",
118 "SR_SF_1J_MT2_220_260", "SR_SF_1J_MT2_260_inf", "SR_SF_1J_MT2_100_inf",
119 "SR_SF_1J_MT2_160_inf", "SR_SF_1J_MT2_100_120", "SR_SF_1J_MT2_120_160"};
120
121 std::string DF0J[] = { "SR_DF_0J_MT2_100_105", "SR_DF_0J_MT2_105_110",
122 "SR_DF_0J_MT2_110_120", "SR_DF_0J_MT2_120_140", "SR_DF_0J_MT2_140_160",
123 "SR_DF_0J_MT2_160_180", "SR_DF_0J_MT2_180_220", "SR_DF_0J_MT2_220_260",
124 "SR_DF_0J_MT2_260_inf", "SR_DF_0J_MT2_100_inf", "SR_DF_0J_MT2_160_inf",
125 "SR_DF_0J_MT2_100_120", "SR_DF_0J_MT2_120_160"};
126 std::string DF1J[] = { "SR_DF_1J_MT2_100_105",
127 "SR_DF_1J_MT2_105_110", "SR_DF_1J_MT2_110_120", "SR_DF_1J_MT2_120_140",
128 "SR_DF_1J_MT2_140_160", "SR_DF_1J_MT2_160_180", "SR_DF_1J_MT2_180_220",
129 "SR_DF_1J_MT2_220_260", "SR_DF_1J_MT2_260_inf", "SR_DF_1J_MT2_100_inf",
130 "SR_DF_1J_MT2_160_inf", "SR_DF_1J_MT2_100_120", "SR_DF_1J_MT2_120_160"};
131
132 Manager()->AddCut("DF dilep. \\& $N_j=0$", DF0J);
133 Manager()->AddCut("DF dilep. \\& $N_j=1$", DF1J);
134 Manager()->AddCut("SF dilep. \\& $N_j=0$", SF0J);
135 Manager()->AddCut("SF dilep. \\& $N_j=1$", SF1J);
136
137 Manager()->AddCut("$m_{l_1,l_2} > 100$ [GeV]", DF);
138 Manager()->AddCut("$m_{l_1,l_2} > 121.2$ [GeV]", SF);
139
140 // Other preselection cuts
141 Manager()->AddCut("$\\slashed{E}_T > 110$ [GeV]");
142 Manager()->AddCut("$\\slashed{E}_T$ Sig. $> 10$ [$\\sqrt{\\rm GeV}$]");
143
144 // MT2 cuts
145 std::string mt2_100_105[] = {"SR_DF_0J_MT2_100_105", "SR_DF_1J_MT2_100_105",
146 "SR_SF_0J_MT2_100_105", "SR_SF_1J_MT2_100_105"};
147 std::string mt2_105_110[] = {"SR_DF_0J_MT2_105_110", "SR_DF_1J_MT2_105_110",
148 "SR_SF_0J_MT2_105_110", "SR_SF_1J_MT2_105_110"};
149 std::string mt2_110_120[] = {"SR_DF_0J_MT2_110_120", "SR_DF_1J_MT2_110_120",
150 "SR_SF_0J_MT2_110_120", "SR_SF_1J_MT2_110_120"};
151 std::string mt2_120_140[] = {"SR_DF_0J_MT2_120_140", "SR_DF_1J_MT2_120_140",
152 "SR_SF_0J_MT2_120_140", "SR_SF_1J_MT2_120_140"};
153 std::string mt2_140_160[] = {"SR_DF_0J_MT2_140_160", "SR_DF_1J_MT2_140_160",
154 "SR_SF_0J_MT2_140_160", "SR_SF_1J_MT2_140_160"};
155 std::string mt2_160_180[] = {"SR_DF_0J_MT2_160_180", "SR_DF_1J_MT2_160_180",
156 "SR_SF_0J_MT2_160_180", "SR_SF_1J_MT2_160_180"};
157 std::string mt2_180_220[] = {"SR_DF_0J_MT2_180_220", "SR_DF_1J_MT2_180_220",
158 "SR_SF_0J_MT2_180_220", "SR_SF_1J_MT2_180_220"};
159 std::string mt2_220_260[] = {"SR_DF_0J_MT2_220_260", "SR_DF_1J_MT2_220_260",
160 "SR_SF_0J_MT2_220_260", "SR_SF_1J_MT2_220_260"};
161 std::string mt2_260_inf[] = {"SR_DF_0J_MT2_260_inf", "SR_DF_1J_MT2_260_inf",
162 "SR_SF_0J_MT2_260_inf", "SR_SF_1J_MT2_260_inf"};
163 std::string mt2_100_inf[] = {"SR_DF_0J_MT2_100_inf", "SR_DF_1J_MT2_100_inf",
164 "SR_SF_0J_MT2_100_inf", "SR_SF_1J_MT2_100_inf"};
165 std::string mt2_160_inf[] = {"SR_DF_0J_MT2_160_inf", "SR_DF_1J_MT2_160_inf",
166 "SR_SF_0J_MT2_160_inf", "SR_SF_1J_MT2_160_inf"};
167 std::string mt2_100_120[] = {"SR_DF_0J_MT2_100_120", "SR_DF_1J_MT2_100_120",
168 "SR_SF_0J_MT2_100_120", "SR_SF_1J_MT2_100_120"};
169 std::string mt2_120_160[] = {"SR_DF_0J_MT2_120_160", "SR_DF_1J_MT2_120_160",
170 "SR_SF_0J_MT2_120_160", "SR_SF_1J_MT2_120_160"};
171
172 Manager()->AddCut("$M_{T2} \\in [100, 105]$ [GeV]", mt2_100_105);
173 Manager()->AddCut("$M_{T2} \\in [105, 110]$ [GeV]", mt2_105_110);
174 Manager()->AddCut("$M_{T2} \\in [110, 120]$ [GeV]", mt2_110_120);
175 Manager()->AddCut("$M_{T2} \\in [120, 140]$ [GeV]", mt2_120_140);
176 Manager()->AddCut("$M_{T2} \\in [140, 160]$ [GeV]", mt2_140_160);
177 Manager()->AddCut("$M_{T2} \\in [160, 180]$ [GeV]", mt2_160_180);
178 Manager()->AddCut("$M_{T2} \\in [180, 220]$ [GeV]", mt2_180_220);
179 Manager()->AddCut("$M_{T2} \\in [220, 260]$ [GeV]", mt2_220_260);
180 Manager()->AddCut("$M_{T2} \\in [260, \\infty[$ [GeV]", mt2_260_inf);
181 Manager()->AddCut("$M_{T2} \\in [100, \\infty[$ [GeV]", mt2_100_inf);
182 Manager()->AddCut("$M_{T2} \\in [160, \\infty[$ [GeV]", mt2_160_inf);
183 Manager()->AddCut("$M_{T2} \\in [100, 120]$ [GeV]", mt2_100_120);
184 Manager()->AddCut("$M_{T2} \\in [120, 160]$ [GeV]", mt2_120_160);
185
186 // Histogram declaration
187 Manager()->AddHisto("MT2-SF-0J",9, 100., 280., SF0J);
188 Manager()->AddHisto("MT2-SF-1J",9, 100., 280., SF1J);
189 Manager()->AddHisto("MT2-DF-0J",9, 100., 280., DF0J);
190 Manager()->AddHisto("MT2-DF-1J",9, 100., 280., DF1J);
191
192 // Exit
193 return true;
194}
195
196// -----------------------------------------------------------------------------
197// Finalize
198// function called one time at the end of the analysis
199// -----------------------------------------------------------------------------
200void atlas_susy_2018_32::Finalize(const SampleFormat& summary,
201 const std::vector<SampleFormat>& files){}
202
203// -----------------------------------------------------------------------------
204// Execute
205// function called each time one event is read
206// -----------------------------------------------------------------------------
207bool atlas_susy_2018_32::Execute(SampleFormat& sample, const EventFormat& event)
208{
209 // Event weight
210 MAdouble64 myWeight;
211 if(Configuration().IsNoEventWeight()) myWeight=1.;
212 else if(event.mc()->weight()!=0.) myWeight=event.mc()->weight();
213 else { return false; }
214 Manager()->InitializeForNewEvent(myWeight);
215
216 // Security for empty events
217 if (event.rec()==0) return true;
218
219 // Electrons
220 std::vector<const RecLeptonFormat*> SignalElectrons;
221 for(MAuint32 i=0; i<event.rec()->electrons().size(); i++)
222 {
223 const RecLeptonFormat *Lep = &(event.rec()->electrons()[i]);
224
225 // Kinematics
226 MAdouble64 eta = Lep->abseta();
227 MAdouble64 pt = Lep->pt();
228
229 // Isolation
230 MAdouble64 iso_dR = std::min(10./pt,0.2);
231 MAdouble64 iso_tracks = PHYSICS->Isol->tracker->relIsolation(Lep, event.rec(), iso_dR, 0.);
232 MAdouble64 iso_all = PHYSICS->Isol->calorimeter->relIsolation(Lep, event.rec(), 0.2, 0.);
233 MAbool iso = (iso_tracks<0.15 && iso_all<0.20);
234 if (pt>200.) { iso = (iso_all<std::max(0.015*pt, 3.5)); }
235
236 // Signal leptons
237 if(eta<2.47 && pt>10. && iso) { SignalElectrons.push_back(Lep);}
238 }
239
240
241 // Muons
242 std::vector<const RecLeptonFormat*> SignalMuons;
243 for(MAuint32 i=0; i<event.rec()->muons().size(); i++)
244 {
245 const RecLeptonFormat *Lep = &(event.rec()->muons()[i]);
246
247 // Kinematics
248 MAdouble64 eta = Lep->abseta();
249 MAdouble64 pt = Lep->pt();
250
251 // Isolation
252 MAdouble64 iso_dR = std::min(10./pt,0.3);
253 MAdouble64 iso_tracks = PHYSICS->Isol->tracker->relIsolation(Lep, event.rec(), iso_dR, 0.);
254 MAdouble64 iso_all = PHYSICS->Isol->calorimeter->relIsolation(Lep, event.rec(), 0.2, 0.);
255 MAbool iso = (iso_tracks<0.15 && iso_all<0.30);
256
257 // Signal leptons
258 if(eta<2.7 && pt>10. && iso) { SignalMuons.push_back(Lep);}
259 }
260
261 // Jets
262 std::vector <const RecJetFormat*> Jets;
263 for(MAuint32 i=0; i<event.rec()->jets().size(); i++)
264 {
265 const RecJetFormat *Jet = &(event.rec()->jets()[i]);
266 MAdouble64 eta = Jet->abseta();
267 MAdouble64 pt = Jet->pt();
268 if(pt>20. && eta<2.4) { Jets.push_back(Jet); }
269 }
270
271 // Object overlap removal
272 Jets = PHYSICS->Isol->JetCleaning(Jets, SignalElectrons, 0.2);
273 Jets = PHYSICS->Isol->JetCleaning(Jets, SignalMuons, 0.4);
274 SignalElectrons = Removal(SignalElectrons, SignalMuons, 0.2);
275
276 // Bjets and HT
277 MAuint32 nb = 0;
278 MAdouble64 HT= 0.;
279 for (MAuint32 i=0; i<Jets.size(); i++)
280 {
281 if(Jets[i]->btag()) { nb++; }
282 HT += Jets[i]->pt();
283 }
284
285 // Leptons
286 std::vector<const RecLeptonFormat*> SignalLeptons;
287 for(MAuint32 i=0; i<SignalMuons.size(); i++)
288 { SignalLeptons.push_back(SignalMuons[i]); }
289 for(MAuint32 i=0; i<SignalElectrons.size(); i++)
290 { SignalLeptons.push_back(SignalElectrons[i]); }
291 SORTER->sort(SignalLeptons, PTordering);
292
293 // MET
294 MAdouble64 MET = event.rec()->MET().pt();
295
296 // DiLepton reconstruction
297 MAuint32 hasOS = 0;
298 MAuint32 hasOSSF = 0;
299 MAuint32 hasOSOF = 0;
300 for (MAuint32 lid = 0; lid < SignalLeptons.size(); lid++)
301 {
302 for (MAuint32 sid = 0; (sid < SignalLeptons.size()) && (sid != lid); sid++)
303 {
304 int sumflvr = -(SignalLeptons[lid]->isMuon()) * 13 * SignalLeptons[lid]->charge() -\
305 (SignalLeptons[lid]->isElectron()) * 11 * SignalLeptons[lid]->charge() -\
306 (SignalLeptons[sid]->isMuon()) * 13 * SignalLeptons[sid]->charge() -\
307 (SignalLeptons[sid]->isElectron()) * 11 * SignalLeptons[sid]->charge();
308 // OS: 0, 2, OSSF : 0
309 // SSOF : 24, SSSF : 22, 26
310 // SSOF : 24, OSOF : 2
311 if (std::abs(sumflvr) == 0) {hasOSSF++; hasOS++;}
312 else if (std::abs(sumflvr) == 2) {hasOSOF++; hasOS++;}
313 }
314 }
315
316 //==================//
317 //==== Cut Flow ====//
318 //==================//
319
320 // Trigger efficiency
321 Manager()->SetCurrentEventWeight(myWeight*0.85);
322
323 MAbool is_pt = false;
324 if (SignalLeptons.size()>1) is_pt = (SignalLeptons[1]->pt()>25.);
325 if(!Manager()->ApplyCut(hasOS==1 && SignalLeptons.size()==2 && is_pt,
326 "OS dilep. with $p^l_T>25$ [GeV]")) return true;
327
328
329 MAdouble64 mll = (SignalLeptons[0]->momentum() + SignalLeptons[1]->momentum()).M();
330 if(!Manager()->ApplyCut(mll>25.,"$m_{l_1,l_2}>25$ [GeV]")) return true;
331
332 if(!Manager()->ApplyCut(nb==0,"b veto")) return true;
333
334 // SF vs DF & Njets
335 MAuint32 nj = Jets.size();
336
337 // SF-DF & Njet cuts
338 if(!Manager()->ApplyCut(hasOSOF==1 && nj==0, "DF dilep. \\& $N_j=0$")) return true;
339 if(!Manager()->ApplyCut(hasOSOF==1 && nj==1, "DF dilep. \\& $N_j=1$")) return true;
340 if(!Manager()->ApplyCut(hasOSSF==1 && nj==0, "SF dilep. \\& $N_j=0$")) return true;
341 if(!Manager()->ApplyCut(hasOSSF==1 && nj==1, "SF dilep. \\& $N_j=1$")) return true;
342
343 if(!Manager()->ApplyCut(mll>100., "$m_{l_1,l_2} > 100$ [GeV]")) return true;
344 if(!Manager()->ApplyCut(mll>121.2, "$m_{l_1,l_2} > 121.2$ [GeV]")) return true;
345
346 // Other preselection cuts
347 MAdouble64 METSig = -1.;
348 if (HT>0) METSig = MET/sqrt(HT);
349 if(!Manager()->ApplyCut(MET>110., "$\\slashed{E}_T > 110$ [GeV]")) return true;
350 if(!Manager()->ApplyCut(METSig>10., "$\\slashed{E}_T$ Sig. $> 10$ [$\\sqrt{\\rm GeV}$]")) return true;
351
352 // Histograms
353 MAdouble64 mt2 = PHYSICS->Transverse->MT2(SignalLeptons[0],SignalLeptons[1],event.rec()->MET(),0.);
354 Manager()->FillHisto("MT2-SF-0J",mt2);
355 Manager()->FillHisto("MT2-SF-1J",mt2);
356 Manager()->FillHisto("MT2-DF-0J",mt2);
357 Manager()->FillHisto("MT2-DF-1J",mt2);
358
359 // MT2
360 if(!Manager()->ApplyCut(mt2>100. && mt2<105.,"$M_{T2} \\in [100, 105]$ [GeV]")) return true;
361 if(!Manager()->ApplyCut(mt2>105. && mt2<110.,"$M_{T2} \\in [105, 110]$ [GeV]")) return true;
362 if(!Manager()->ApplyCut(mt2>110. && mt2<120.,"$M_{T2} \\in [110, 120]$ [GeV]")) return true;
363 if(!Manager()->ApplyCut(mt2>120. && mt2<140.,"$M_{T2} \\in [120, 140]$ [GeV]")) return true;
364 if(!Manager()->ApplyCut(mt2>140. && mt2<160.,"$M_{T2} \\in [140, 160]$ [GeV]")) return true;
365 if(!Manager()->ApplyCut(mt2>160. && mt2<180.,"$M_{T2} \\in [160, 180]$ [GeV]")) return true;
366 if(!Manager()->ApplyCut(mt2>180. && mt2<220.,"$M_{T2} \\in [180, 220]$ [GeV]")) return true;
367 if(!Manager()->ApplyCut(mt2>220. && mt2<260.,"$M_{T2} \\in [220, 260]$ [GeV]")) return true;
368 if(!Manager()->ApplyCut(mt2>260. ,"$M_{T2} \\in [260, \\infty[$ [GeV]")) return true;
369 if(!Manager()->ApplyCut(mt2>100. ,"$M_{T2} \\in [100, \\infty[$ [GeV]")) return true;
370 if(!Manager()->ApplyCut(mt2>160. ,"$M_{T2} \\in [160, \\infty[$ [GeV]")) return true;
371 if(!Manager()->ApplyCut(mt2>100. && mt2<120.,"$M_{T2} \\in [100, 120]$ [GeV]")) return true;
372 if(!Manager()->ApplyCut(mt2>120. && mt2<160.,"$M_{T2} \\in [120, 160]$ [GeV]")) return true;
373
374 // Exit
375 return true;
376}
377
378// Overlap Removal
379template<typename T1, typename T2> std::vector<const T1*>
380 Removal(std::vector<const T1*> &v1, std::vector<const T2*> &v2, const MAdouble64 &drmin)
381{
382 // Determining with objects should be removed
383 std::vector<bool> mask(v1.size(),false);
384 for (MAuint32 j=0;j<v1.size();j++)
385 for (MAuint32 i=0;i<v2.size();i++)
386 if (v2[i]->dr(v1[j]) < drmin)
387 {
388 mask[j]=true;
389 break;
390 }
391
392 // Building the cleaned container
393 std::vector<const T1*> cleaned_v1;
394 for (MAuint32 i=0;i<v1.size();i++)
395 if (!mask[i]) cleaned_v1.push_back(v1[i]);
396
397 return cleaned_v1;
398}
399