1 | #include "SampleAnalyzer/User/Analyzer/cms_sus_16_048.h"
|
---|
2 | using namespace MA5;
|
---|
3 | using namespace std;
|
---|
4 |
|
---|
5 | // -----------------------------------------------------------------------------
|
---|
6 | // Initialize
|
---|
7 | // function called one time at the beginning of the analysis
|
---|
8 | // -----------------------------------------------------------------------------
|
---|
9 | bool cms_sus_16_048::Initialize(const MA5::Configuration& cfg,
|
---|
10 | const std::map<std::string,std::string>& parameters)
|
---|
11 | {
|
---|
12 | INFO << " <><><><><><><><><><><><><><><><><><><><><><><><><>" << endmsg;
|
---|
13 | INFO << " <> Analysis: CMS_SUS_16_048, arXiv:1801.01846 <>" << endmsg;
|
---|
14 | INFO << " <> (soft dilepton LHC13, 35.9 fb^-1)<>" << endmsg;
|
---|
15 | INFO << " <> Recasted by: B. Fuks <>" << endmsg;
|
---|
16 | INFO << " <> Contacts: fuks@lpthe.jussieu.fr <>" << endmsg;
|
---|
17 | INFO << " <> Based on MadAnalysis 5 v1.8 <>" << endmsg;
|
---|
18 | INFO << " <><><><><><><><><><><><><><><><><><><><><><><><><>" << endmsg;
|
---|
19 |
|
---|
20 | // Signal regions
|
---|
21 | Manager()->AddRegionSelection("Ewkino_lowMET_M_4to9");
|
---|
22 | Manager()->AddRegionSelection("Ewkino_lowMET_M_10to20");
|
---|
23 | Manager()->AddRegionSelection("Ewkino_lowMET_M_20to30");
|
---|
24 | Manager()->AddRegionSelection("Ewkino_lowMET_M_30to50");
|
---|
25 | Manager()->AddRegionSelection("Ewkino_medMET_M_4to9");
|
---|
26 | Manager()->AddRegionSelection("Ewkino_medMET_M_10to20");
|
---|
27 | Manager()->AddRegionSelection("Ewkino_medMET_M_20to30");
|
---|
28 | Manager()->AddRegionSelection("Ewkino_medMET_M_30to50");
|
---|
29 | Manager()->AddRegionSelection("Ewkino_highMET_M_4to9");
|
---|
30 | Manager()->AddRegionSelection("Ewkino_highMET_M_10to20");
|
---|
31 | Manager()->AddRegionSelection("Ewkino_highMET_M_20to30");
|
---|
32 | Manager()->AddRegionSelection("Ewkino_highMET_M_30to50");
|
---|
33 |
|
---|
34 | Manager()->AddRegionSelection("stop_lowMET_PT_5to12");
|
---|
35 | Manager()->AddRegionSelection("stop_lowMET_PT_12to20");
|
---|
36 | Manager()->AddRegionSelection("stop_lowMET_PT_20to30");
|
---|
37 | Manager()->AddRegionSelection("stop_medMET_PT_5to12");
|
---|
38 | Manager()->AddRegionSelection("stop_medMET_PT_12to20");
|
---|
39 | Manager()->AddRegionSelection("stop_medMET_PT_20to30");
|
---|
40 | Manager()->AddRegionSelection("stop_highMET_PT_5to12");
|
---|
41 | Manager()->AddRegionSelection("stop_highMET_PT_12to20");
|
---|
42 | Manager()->AddRegionSelection("stop_highMET_PT_20to30");
|
---|
43 |
|
---|
44 | // Preselection cuts
|
---|
45 | std::string ewkinos[] = {"Ewkino_lowMET_M_4to9", "Ewkino_lowMET_M_10to20",
|
---|
46 | "Ewkino_lowMET_M_20to30", "Ewkino_lowMET_M_30to50", "Ewkino_medMET_M_4to9",
|
---|
47 | "Ewkino_medMET_M_10to20", "Ewkino_medMET_M_20to30", "Ewkino_medMET_M_30to50",
|
---|
48 | "Ewkino_highMET_M_4to9", "Ewkino_highMET_M_10to20","Ewkino_highMET_M_20to30",
|
---|
49 | "Ewkino_highMET_M_30to50"};
|
---|
50 | std::string non_stpHM[] = {"Ewkino_lowMET_M_4to9", "Ewkino_lowMET_M_10to20",
|
---|
51 | "Ewkino_lowMET_M_20to30", "Ewkino_lowMET_M_30to50", "Ewkino_medMET_M_4to9",
|
---|
52 | "Ewkino_medMET_M_10to20", "Ewkino_medMET_M_20to30", "Ewkino_medMET_M_30to50",
|
---|
53 | "Ewkino_highMET_M_4to9", "Ewkino_highMET_M_10to20","Ewkino_highMET_M_20to30",
|
---|
54 | "Ewkino_highMET_M_30to50", "stop_lowMET_PT_5to12","stop_lowMET_PT_12to20",
|
---|
55 | "stop_lowMET_PT_20to30", "stop_medMET_PT_5to12", "stop_medMET_PT_12to20",
|
---|
56 | "stop_medMET_PT_20to30"};
|
---|
57 | std::string lowMET[] = {"Ewkino_lowMET_M_4to9", "Ewkino_lowMET_M_10to20",
|
---|
58 | "Ewkino_lowMET_M_20to30", "Ewkino_lowMET_M_30to50", "stop_lowMET_PT_5to12",
|
---|
59 | "stop_lowMET_PT_12to20", "stop_lowMET_PT_20to30"};
|
---|
60 | Manager()->AddCut("Lepton_1_init");
|
---|
61 | Manager()->AddCut("Lepton_1");
|
---|
62 | Manager()->AddCut("Lepton_2");
|
---|
63 | Manager()->AddCut("Lepton_2_nonStopHM", non_stpHM);
|
---|
64 | Manager()->AddCut("Dimuon",lowMET);
|
---|
65 | Manager()->AddCut("SameFlavour",ewkinos);
|
---|
66 | Manager()->AddCut("OSdilepton");
|
---|
67 | Manager()->AddCut("pt(ll)");
|
---|
68 | Manager()->AddCut("M(ll)_bounds", ewkinos);
|
---|
69 | Manager()->AddCut("M(ll)_hadronic_veto", ewkinos);
|
---|
70 |
|
---|
71 | // MET cuts
|
---|
72 | std::string ewk_medMET[] = {"Ewkino_medMET_M_4to9", "Ewkino_medMET_M_10to20",
|
---|
73 | "Ewkino_medMET_M_20to30", "Ewkino_medMET_M_30to50"};
|
---|
74 | std::string ewk_highMET[] = {"Ewkino_highMET_M_4to9",
|
---|
75 | "Ewkino_highMET_M_10to20","Ewkino_highMET_M_20to30",
|
---|
76 | "Ewkino_highMET_M_30to50"};
|
---|
77 | std::string stp_medMET[] = {"stop_medMET_PT_5to12", "stop_medMET_PT_12to20",
|
---|
78 | "stop_medMET_PT_20to30"};
|
---|
79 | std::string stp_highMET[] = {"stop_highMET_PT_5to12", "stop_highMET_PT_12to20",
|
---|
80 | "stop_highMET_PT_20to30"};
|
---|
81 | Manager()->AddCut("MET");
|
---|
82 | Manager()->AddCut("lowMET",lowMET);
|
---|
83 | Manager()->AddCut("MET_corrected");
|
---|
84 | Manager()->AddCut("lowMET_corrected",lowMET);
|
---|
85 | Manager()->AddCut("ewk_medMET", ewk_medMET);
|
---|
86 | Manager()->AddCut("ewk_highMET",ewk_highMET);
|
---|
87 | Manager()->AddCut("stp_medMET", stp_medMET);
|
---|
88 | Manager()->AddCut("stp_highMET",stp_highMET);
|
---|
89 |
|
---|
90 | // Follow up preselection
|
---|
91 | Manager()->AddCut("ISR_jet");
|
---|
92 | Manager()->AddCut("HT");
|
---|
93 | Manager()->AddCut("MET/HT");
|
---|
94 | Manager()->AddCut("b-veto");
|
---|
95 | Manager()->AddCut("Mtautau");
|
---|
96 | Manager()->AddCut("MT_MET",ewkinos);
|
---|
97 |
|
---|
98 | // Mll cuts
|
---|
99 | std::string MLL4_9[] = {"Ewkino_lowMET_M_4to9", "Ewkino_medMET_M_4to9",
|
---|
100 | "Ewkino_highMET_M_4to9"};
|
---|
101 | std::string MLL10_20[] = {"Ewkino_lowMET_M_10to20", "Ewkino_medMET_M_10to20",
|
---|
102 | "Ewkino_highMET_M_10to20"};
|
---|
103 | std::string MLL20_30[] = {"Ewkino_lowMET_M_20to30", "Ewkino_medMET_M_20to30",
|
---|
104 | "Ewkino_highMET_M_20to30"};
|
---|
105 | std::string MLL30_50[] = {"Ewkino_lowMET_M_30to50", "Ewkino_medMET_M_30to50",
|
---|
106 | "Ewkino_highMET_M_30to50"};
|
---|
107 | Manager()->AddCut("MLL4_9",MLL4_9);
|
---|
108 | Manager()->AddCut("MLL10_20",MLL10_20);
|
---|
109 | Manager()->AddCut("MLL20_30",MLL20_30);
|
---|
110 | Manager()->AddCut("MLL30_50",MLL30_50);
|
---|
111 |
|
---|
112 | // PT(lepton1)
|
---|
113 | std::string PTL5_12[] = {"stop_lowMET_PT_5to12", "stop_medMET_PT_5to12",
|
---|
114 | "stop_highMET_PT_5to12"};
|
---|
115 | std::string PTL12_20[] = {"stop_lowMET_PT_12to20", "stop_medMET_PT_12to20",
|
---|
116 | "stop_highMET_PT_12to20"};
|
---|
117 | std::string PTL20_30[] = {"stop_lowMET_PT_20to30", "stop_medMET_PT_20to30",
|
---|
118 | "stop_highMET_PT_20to30"};
|
---|
119 | Manager()->AddCut("PTL5_12", PTL5_12);
|
---|
120 | Manager()->AddCut("PTL12_20",PTL12_20);
|
---|
121 | Manager()->AddCut("PTL20_30",PTL20_30);
|
---|
122 |
|
---|
123 |
|
---|
124 | return true;
|
---|
125 | }
|
---|
126 |
|
---|
127 | // -----------------------------------------------------------------------------
|
---|
128 | // Finalize
|
---|
129 | // function called one time at the end of the analysis
|
---|
130 | // -----------------------------------------------------------------------------
|
---|
131 | void cms_sus_16_048::Finalize(const SampleFormat& summary,
|
---|
132 | const std::vector<SampleFormat>& files)
|
---|
133 | {
|
---|
134 | }
|
---|
135 |
|
---|
136 | // -----------------------------------------------------------------------------
|
---|
137 | // Execute
|
---|
138 | // function called each time one event is read
|
---|
139 | // -----------------------------------------------------------------------------
|
---|
140 | bool cms_sus_16_048::Execute(SampleFormat& sample, const EventFormat& event)
|
---|
141 | {
|
---|
142 | // Security for empty events
|
---|
143 | if (event.rec()==0) return true;
|
---|
144 |
|
---|
145 | // Event weight
|
---|
146 | double myEventWeight;
|
---|
147 | if(Configuration().IsNoEventWeight()) myEventWeight=1.;
|
---|
148 | else if(event.mc()->weight()!=0.) myEventWeight = event.mc()->weight();
|
---|
149 | else return false;
|
---|
150 | Manager()->InitializeForNewEvent(myEventWeight);
|
---|
151 |
|
---|
152 | // Leptons
|
---|
153 | std::vector<const RecLeptonFormat*> Leptons;
|
---|
154 | for(unsigned int ii=0; ii<event.rec()->electrons().size(); ii++)
|
---|
155 | {
|
---|
156 | const RecLeptonFormat *myElec = &(event.rec()->electrons()[ii]);
|
---|
157 | if(myElec->pt()<5. || myElec->abseta()>2.5) continue;
|
---|
158 | Leptons.push_back(myElec);
|
---|
159 | }
|
---|
160 | for(unsigned int ii=0; ii<event.rec()->muons().size(); ii++)
|
---|
161 | {
|
---|
162 | const RecLeptonFormat *myMuon = &(event.rec()->muons()[ii]);
|
---|
163 | if(myMuon->pt()<3.5 || myMuon->abseta()>2.4) continue;
|
---|
164 | Leptons.push_back(myMuon);
|
---|
165 | }
|
---|
166 | SORTER->sort(Leptons);
|
---|
167 | unsigned int Nl = Leptons.size();
|
---|
168 | if(!Manager()->ApplyCut((event.rec()->electrons().size()+event.rec()->muons().size())>0, "Lepton_1_init")) return true;
|
---|
169 |
|
---|
170 | // Jets
|
---|
171 | std::vector<const RecJetFormat*> SignalJets;
|
---|
172 | for(unsigned int ii=0; ii<event.rec()->jets().size(); ii++)
|
---|
173 | {
|
---|
174 | const RecJetFormat * myJet = &(event.rec()->jets()[ii]);
|
---|
175 | if(myJet->pt()<25. || myJet->abseta()>2.4) continue;
|
---|
176 | SignalJets.push_back(myJet);
|
---|
177 | }
|
---|
178 | SignalJets = PHYSICS->Isol->JetCleaning(SignalJets, Leptons, 0.2);
|
---|
179 | double HT=0.;
|
---|
180 | unsigned int Nb=0, Nj = SignalJets.size();
|
---|
181 | for(unsigned int ii=0; ii<SignalJets.size(); ii++)
|
---|
182 | {
|
---|
183 | HT+=SignalJets[ii]->pt();
|
---|
184 | if(SignalJets[ii]->btag()) Nb++;
|
---|
185 | }
|
---|
186 |
|
---|
187 | // Requirement on the first lepton
|
---|
188 | bool firstlpt = (Nl>=1) && (Leptons[0]->pt()>5.) && (Leptons[0]->pt()<30.);
|
---|
189 | if(!Manager()->ApplyCut(firstlpt, "Lepton_1")) return true;
|
---|
190 |
|
---|
191 | // Requirement on the second lepton
|
---|
192 | bool seclpt_general = (Nl>=2) && (Leptons[1]->pt()<30.);
|
---|
193 | if(!Manager()->ApplyCut(seclpt_general, "Lepton_2")) return true;
|
---|
194 | bool seclpt_non_stpHM = (Leptons[1]->pt()>5.);
|
---|
195 | if(!Manager()->ApplyCut(seclpt_non_stpHM, "Lepton_2_nonStopHM")) return true;
|
---|
196 |
|
---|
197 | // 1 OS dilepton / flavour requirements
|
---|
198 | bool osdilep = (Nl==2) && (Leptons[0]->charge()*Leptons[1]->charge()<0);
|
---|
199 | bool is_SF = (Leptons[0]->isMuon()==Leptons[1]->isMuon());
|
---|
200 | bool is_dimuon = is_SF && Leptons[0]->isMuon();
|
---|
201 | if(!Manager()->ApplyCut(is_dimuon, "Dimuon")) return true;
|
---|
202 | if(!Manager()->ApplyCut(is_SF, "SameFlavour")) return true;
|
---|
203 | if(!Manager()->ApplyCut(osdilep, "OSdilepton")) return true;
|
---|
204 |
|
---|
205 | // Missing Transverse Energy
|
---|
206 | MALorentzVector ptmiss = event.rec()->MET().momentum();
|
---|
207 | double MET = ptmiss.Pt();
|
---|
208 | double MET_cor = (ptmiss + Leptons[0]->momentum()+Leptons[1]->momentum()).Pt();
|
---|
209 |
|
---|
210 | // PT(ll) and Mll
|
---|
211 | double ptll = (Leptons[0]->momentum()+Leptons[1]->momentum()).Pt();
|
---|
212 | double mll = (Leptons[0]->momentum()+Leptons[1]->momentum()).M();
|
---|
213 | bool mll_lims = is_SF && (mll>4.) && (mll<50.);
|
---|
214 | bool mll_veto = is_SF && ((mll<9.) || (mll>10.5));
|
---|
215 | if(!Manager()->ApplyCut(ptll>3., "pt(ll)")) return true;
|
---|
216 | if(!Manager()->ApplyCut(mll_lims, "M(ll)_bounds")) return true;
|
---|
217 | if(!Manager()->ApplyCut(mll_veto, "M(ll)_hadronic_veto")) return true;
|
---|
218 |
|
---|
219 | // MET cut
|
---|
220 | if(!Manager()->ApplyCut(MET>125., "MET")) return true;
|
---|
221 | if(!Manager()->ApplyCut(is_dimuon && MET<200., "lowMET")) return true;
|
---|
222 | // Trigger efficiency
|
---|
223 | if(is_dimuon && MET < 200.)
|
---|
224 | { Manager()->SetCurrentEventWeight(0.65*myEventWeight); }
|
---|
225 | // Corrected MET cuts
|
---|
226 | if(!Manager()->ApplyCut(is_dimuon && MET_cor>125., "MET_corrected")) return true;
|
---|
227 | if(!Manager()->ApplyCut(is_dimuon && MET_cor<200., "lowMET_corrected"))
|
---|
228 | return true;
|
---|
229 | if(!Manager()->ApplyCut(MET>200. && MET<250., "ewk_medMET")) return true;
|
---|
230 | if(!Manager()->ApplyCut(MET>200. && MET<300., "stp_medMET")) return true;
|
---|
231 | if(!Manager()->ApplyCut(MET>250., "ewk_highMET")) return true;
|
---|
232 | if(!Manager()->ApplyCut(MET>300., "stp_highMET")) return true;
|
---|
233 |
|
---|
234 | // ISR jet
|
---|
235 | if(!Manager()->ApplyCut(Nj>0, "ISR_jet")) return true;
|
---|
236 | if(!Manager()->ApplyCut(HT>100., "HT")) return true;
|
---|
237 |
|
---|
238 | // MET to HT
|
---|
239 | if(!Manager()->ApplyCut(MET/HT<1.4 && MET/HT>0.6, "MET/HT")) return true;
|
---|
240 |
|
---|
241 | // b-veto
|
---|
242 | if(!Manager()->ApplyCut(Nb==0, "b-veto")) return true;
|
---|
243 |
|
---|
244 | // M(tau tau)
|
---|
245 | double AA = -(ptmiss.Px()*Leptons[1]->py() - ptmiss.Py()*Leptons[1]->px())/
|
---|
246 | (Leptons[0]->py()*Leptons[1]->px() - Leptons[0]->px()*Leptons[1]->py());
|
---|
247 | double BB = (ptmiss.Px()*Leptons[0]->py() - ptmiss.Py()*Leptons[0]->px())/
|
---|
248 | (Leptons[0]->py()*Leptons[1]->px() - Leptons[0]->px()*Leptons[1]->py());
|
---|
249 | double mtautau = ((AA+1.)*Leptons[0]->momentum() + (BB+1.)*Leptons[1]->momentum()).M();
|
---|
250 | if(!Manager()->ApplyCut(mtautau<0. || mtautau>160., "Mtautau")) return true;
|
---|
251 |
|
---|
252 | // MT(li, met)
|
---|
253 | double mt1 = sqrt(2.*Leptons[0]->pt()*MET*(1.-cos(Leptons[0]->dphi_0_pi(ptmiss))));
|
---|
254 | double mt2 = sqrt(2.*Leptons[1]->pt()*MET*(1.-cos(Leptons[1]->dphi_0_pi(ptmiss))));
|
---|
255 | if(!Manager()->ApplyCut(std::max(mt1,mt2)<70., "MT_MET")) return true;
|
---|
256 |
|
---|
257 | // Mll
|
---|
258 | if(!Manager()->ApplyCut(mll<9., "MLL4_9")) return true;
|
---|
259 | if(!Manager()->ApplyCut(mll>10.5 && mll<20., "MLL10_20")) return true;
|
---|
260 | if(!Manager()->ApplyCut(mll>20. && mll<30., "MLL20_30")) return true;
|
---|
261 | if(!Manager()->ApplyCut(mll>30., "MLL30_50")) return true;
|
---|
262 |
|
---|
263 | // pt(l1)
|
---|
264 | double pt1=Leptons[0]->pt();
|
---|
265 | if(!Manager()->ApplyCut(pt1<12., "PTL5_12")) return true;
|
---|
266 | if(!Manager()->ApplyCut(pt1>12. && pt1<20., "PTL12_20")) return true;
|
---|
267 | if(!Manager()->ApplyCut(pt1>20. && pt1<30., "PTL20_30")) return true;
|
---|
268 |
|
---|
269 | // exit
|
---|
270 | return true;
|
---|
271 | }
|
---|
272 |
|
---|
273 | // Overlap Removal
|
---|
274 | template<typename T1, typename T2> std::vector<const T1*> cms_sus_16_048::Removal(std::vector<const T1*> &v1,
|
---|
275 | std::vector<const T2*> &v2, const double &drmin)
|
---|
276 | {
|
---|
277 | // Determining with objects should be removed
|
---|
278 | std::vector<bool> mask(v1.size(),false);
|
---|
279 | for (unsigned int j=0;j<v1.size();j++)
|
---|
280 | for (unsigned int i=0;i<v2.size();i++)
|
---|
281 | if (v2[i]->dr(v1[j]) < drmin)
|
---|
282 | {
|
---|
283 | mask[j]=true;
|
---|
284 | break;
|
---|
285 | }
|
---|
286 |
|
---|
287 | // Building the cleaned container
|
---|
288 | std::vector<const T1*> cleaned_v1;
|
---|
289 | for (unsigned int i=0;i<v1.size();i++)
|
---|
290 | if (!mask[i]) cleaned_v1.push_back(v1[i]);
|
---|
291 |
|
---|
292 | return cleaned_v1;
|
---|
293 | }
|
---|
294 |
|
---|