1 | #include "SampleAnalyzer/User/Analyzer/atlas_exot_2018_30.h"
|
---|
2 | using namespace MA5;
|
---|
3 | using namespace std;
|
---|
4 |
|
---|
5 |
|
---|
6 | template<typename T1, typename T2> std::vector<const T1*> Removal(std::vector<const T1*> &v1, std::vector<const T2*> &v2, const MAdouble64 &drmin) {
|
---|
7 | // Determining with objects should be removed
|
---|
8 | std::vector<bool> mask(v1.size(), false);
|
---|
9 | for (MAuint32 j=0; j<v1.size(); j++)
|
---|
10 | for (MAuint32 i=0; i<v2.size(); i++)
|
---|
11 | if (v2[i]->dr(v1[j]) < drmin) {
|
---|
12 | mask[j] = true;
|
---|
13 | break;
|
---|
14 | }
|
---|
15 |
|
---|
16 | // Building the cleaned container
|
---|
17 | std::vector<const T1*> cleaned_v1;
|
---|
18 | for (MAuint32 i=0; i<v1.size(); i++)
|
---|
19 | if (!mask[i]) cleaned_v1.push_back(v1[i]);
|
---|
20 |
|
---|
21 | return cleaned_v1;
|
---|
22 | }
|
---|
23 |
|
---|
24 | // -----------------------------------------------------------------------------
|
---|
25 | // Initialize
|
---|
26 | // function called one time at the beginning of the analysis
|
---|
27 | // -----------------------------------------------------------------------------
|
---|
28 | bool atlas_exot_2018_30::Initialize(const MA5::Configuration& cfg, const std::map<std::string,std::string>& parameters)
|
---|
29 | {
|
---|
30 | cout << "BEGIN Initialization" << endl;
|
---|
31 |
|
---|
32 | INFO << " <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>" << endmsg;
|
---|
33 | INFO << " <> Analysis: ATLAS-EXOT-2018-30, arXiv:1906.05609 <>" << endmsg;
|
---|
34 | INFO << " <> W' to single lepton + MET, 139 fb^-1 lumi (13 TeV) <>" << endmsg;
|
---|
35 | INFO << " <> Recast by: Kyungmin Park <>" << endmsg;
|
---|
36 | INFO << " <> Contact: jazzykm0110@uos.ac.kr <>" << endmsg;
|
---|
37 | INFO << " <> Based on MadAnalysis 5 v1.8.40 <>" << endmsg;
|
---|
38 | INFO << " <> For more information, see <>" << endmsg;
|
---|
39 | INFO << " <> http://madanalysis.irmp.ucl.ac.be/wiki/PublicAnalysisDatabase <>" << endmsg;
|
---|
40 | INFO << " <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>" << endmsg;
|
---|
41 |
|
---|
42 |
|
---|
43 | // Declaration of the signal regions
|
---|
44 | Manager()->AddRegionSelection("SR_Electron_MT_130_400");
|
---|
45 | Manager()->AddRegionSelection("SR_Electron_MT_400_600");
|
---|
46 | Manager()->AddRegionSelection("SR_Electron_MT_600_1000");
|
---|
47 | Manager()->AddRegionSelection("SR_Electron_MT_1000_2000");
|
---|
48 | Manager()->AddRegionSelection("SR_Electron_MT_2000_3000");
|
---|
49 | Manager()->AddRegionSelection("SR_Electron_MT_3000_10000");
|
---|
50 | Manager()->AddRegionSelection("SR_Electron_MT_130_inf");
|
---|
51 |
|
---|
52 | Manager()->AddRegionSelection("SR_Muon_MT_110_400");
|
---|
53 | Manager()->AddRegionSelection("SR_Muon_MT_400_600");
|
---|
54 | Manager()->AddRegionSelection("SR_Muon_MT_600_1000");
|
---|
55 | Manager()->AddRegionSelection("SR_Muon_MT_1000_2000");
|
---|
56 | Manager()->AddRegionSelection("SR_Muon_MT_2000_3000");
|
---|
57 | Manager()->AddRegionSelection("SR_Muon_MT_3000_10000");
|
---|
58 | Manager()->AddRegionSelection("SR_Muon_MT_110_inf");
|
---|
59 |
|
---|
60 |
|
---|
61 | // Cuts for each SR
|
---|
62 | std::string OneElec[] = { "SR_Electron_MT_130_400", "SR_Electron_MT_400_600", "SR_Electron_MT_600_1000", "SR_Electron_MT_1000_2000", "SR_Electron_MT_2000_3000", "SR_Electron_MT_3000_10000", "SR_Electron_MT_130_inf" };
|
---|
63 | std::string OneMuon[] = { "SR_Muon_MT_110_400", "SR_Muon_MT_400_600", "SR_Muon_MT_600_1000", "SR_Muon_MT_1000_2000", "SR_Muon_MT_2000_3000", "SR_Muon_MT_3000_10000", "SR_Muon_MT_110_inf" };
|
---|
64 |
|
---|
65 | std::string MT_400_600[] = { "SR_Electron_MT_400_600", "SR_Muon_MT_400_600" };
|
---|
66 | std::string MT_600_1000[] = { "SR_Electron_MT_600_1000", "SR_Muon_MT_600_1000" };
|
---|
67 | std::string MT_1000_2000[] = { "SR_Electron_MT_1000_2000", "SR_Muon_MT_1000_2000" };
|
---|
68 | std::string MT_2000_3000[] = { "SR_Electron_MT_2000_3000", "SR_Muon_MT_2000_3000" };
|
---|
69 | std::string MT_3000_10000[] = { "SR_Electron_MT_3000_10000", "SR_Muon_MT_3000_10000" };
|
---|
70 |
|
---|
71 | Manager()->AddCut("One Electron", OneElec);
|
---|
72 | Manager()->AddCut("One Muon", OneMuon);
|
---|
73 |
|
---|
74 | Manager()->AddCut("Lepton Veto for Electrons", OneElec);
|
---|
75 | Manager()->AddCut("Lepton Veto for Muons", OneMuon);
|
---|
76 |
|
---|
77 | Manager()->AddCut("$\\slashed{E}_T > 55$ [GeV]", OneMuon);
|
---|
78 | Manager()->AddCut("$\\slashed{E}_T > 65$ [GeV]", OneElec);
|
---|
79 | Manager()->AddCut("$M_T > 130$ [GeV]", OneElec);
|
---|
80 | Manager()->AddCut("$M_T > 110$ [GeV]", OneMuon);
|
---|
81 |
|
---|
82 | Manager()->AddCut("$110 < M_T < 400$ [GeV]", OneMuon[0]);
|
---|
83 | Manager()->AddCut("$130 < M_T < 400$ [GeV]", OneElec[0]);
|
---|
84 | Manager()->AddCut("$400 < M_T < 600$ [GeV]", MT_400_600);
|
---|
85 | Manager()->AddCut("$600 < M_T < 1000$ [GeV]", MT_600_1000);
|
---|
86 | Manager()->AddCut("$1000 < M_T < 2000$ [GeV]", MT_1000_2000);
|
---|
87 | Manager()->AddCut("$2000 < M_T < 3000$ [GeV]", MT_2000_3000);
|
---|
88 | Manager()->AddCut("$3000 < M_T < 10000$ [GeV]", MT_3000_10000);
|
---|
89 |
|
---|
90 |
|
---|
91 | // Histogram declaration
|
---|
92 | //Manager()->AddHisto("MT > 110 GeV for Muon Channel", 50, 110, 7200, OneMuon[6]);
|
---|
93 | //Manager()->AddHisto("MT > 130 GeV for Electron Channel", 60, 130, 7200, OneElec[6]);
|
---|
94 |
|
---|
95 | Manager()->AddHistoLogX("MT > 110 GeV for Muon Channel (finer log bins)", 100, 110, 7200, OneMuon[6]);
|
---|
96 | Manager()->AddHistoLogX("MT > 130 GeV for Electron Channel (finer log bins)", 120, 130, 7200, OneElec[6]);
|
---|
97 |
|
---|
98 | Manager()->AddHistoLogX("MT > 110 GeV for Muon Channel (log bins)", 50, 110, 7200, OneMuon[6]);
|
---|
99 | Manager()->AddHistoLogX("MT > 130 GeV for Electron Channel (log bins)",60, 130, 7200, OneElec[6]);
|
---|
100 |
|
---|
101 | cout << "END Initialization" << endl;
|
---|
102 | return true;
|
---|
103 | }
|
---|
104 |
|
---|
105 |
|
---|
106 | // -----------------------------------------------------------------------------
|
---|
107 | // Finalize
|
---|
108 | // function called one time at the end of the analysis
|
---|
109 | // -----------------------------------------------------------------------------
|
---|
110 | void atlas_exot_2018_30::Finalize(const SampleFormat& summary, const std::vector<SampleFormat>& files)
|
---|
111 | {
|
---|
112 | cout << "BEGIN Finalization" << endl;
|
---|
113 | // saving histos
|
---|
114 | cout << "END Finalization" << endl;
|
---|
115 | }
|
---|
116 |
|
---|
117 |
|
---|
118 | // -----------------------------------------------------------------------------
|
---|
119 | // Execute
|
---|
120 | // function called each time one event is read
|
---|
121 | // -----------------------------------------------------------------------------
|
---|
122 | bool atlas_exot_2018_30::Execute(SampleFormat& sample, const EventFormat& event)
|
---|
123 | {
|
---|
124 | // Event weight
|
---|
125 | double myWeight;
|
---|
126 | if (Configuration().IsNoEventWeight()) myWeight = 1.;
|
---|
127 | else if (event.mc()->weight() != 0.) myWeight = event.mc()->weight();
|
---|
128 | else { return false; }
|
---|
129 | Manager()->InitializeForNewEvent(myWeight);
|
---|
130 |
|
---|
131 | // Security for empty events
|
---|
132 | if (event.rec() == 0) return true;
|
---|
133 |
|
---|
134 |
|
---|
135 | // Muon
|
---|
136 | std::vector<const RecLeptonFormat*> SignalMuons, VetoedMuons;
|
---|
137 | for (unsigned int i=0; i<event.rec()->muons().size(); i++) {
|
---|
138 | const RecLeptonFormat *Muon = &(event.rec()->muons()[i]);
|
---|
139 |
|
---|
140 | // Kinematics
|
---|
141 | double eta = Muon->abseta();
|
---|
142 | double pt = Muon->pt();
|
---|
143 |
|
---|
144 | // Isolation
|
---|
145 | double iso_dR = std::min(10./pt, 0.3);
|
---|
146 | double iso_tracks = PHYSICS->Isol->eflow->relIsolation(Muon, event.rec(), iso_dR, 1., IsolationEFlow::TRACK_COMPONENT);
|
---|
147 | bool iso = (iso_tracks < 0.15);
|
---|
148 |
|
---|
149 | // Signal Muons
|
---|
150 | if ( (0.1 < eta && eta < 1.01) || (1.1 < eta && eta < 2.4) ) {
|
---|
151 | if ( pt > 55. ) {
|
---|
152 | if ( iso ) { SignalMuons.push_back(Muon); continue; }
|
---|
153 | }
|
---|
154 | }
|
---|
155 |
|
---|
156 | // Vetoed Muons
|
---|
157 | if ( pt > 20. ) { VetoedMuons.push_back(Muon); }
|
---|
158 | }
|
---|
159 |
|
---|
160 |
|
---|
161 | // Electron
|
---|
162 | std::vector<const RecLeptonFormat*> SignalElectrons, VetoedElectrons, VetoedElectronsDeltaR;
|
---|
163 | for (unsigned int i=0; i<event.rec()->electrons().size(); i++) {
|
---|
164 | const RecLeptonFormat *Elec = &(event.rec()->electrons()[i]);
|
---|
165 |
|
---|
166 | // Kinematics
|
---|
167 | double eta = Elec->abseta();
|
---|
168 | double pt = Elec->pt();
|
---|
169 | double Et = Elec->et();
|
---|
170 |
|
---|
171 | // Isolation
|
---|
172 | double iso_tracks = PHYSICS->Isol->eflow->relIsolation(Elec, event.rec(), 0.2, 0., IsolationEFlow::TRACK_COMPONENT);
|
---|
173 | double iso_all = PHYSICS->Isol->eflow->relIsolation(Elec, event.rec(), 0.2, 0., IsolationEFlow::ALL_COMPONENTS);
|
---|
174 | bool iso = (iso_tracks < 0.06 && iso_all < 0.06);
|
---|
175 |
|
---|
176 | // Signal Electrons
|
---|
177 | if ( eta < 1.37 || ( 1.52 < eta && eta < 2.47 ) ) {
|
---|
178 | if ( Et > 65. && iso ) { SignalElectrons.push_back(Elec); continue; }
|
---|
179 | }
|
---|
180 |
|
---|
181 | // Vetoed Electrons
|
---|
182 | if ( pt > 20. ) {
|
---|
183 | VetoedElectrons.push_back(Elec);
|
---|
184 | // additional condition for delta R
|
---|
185 | if ( SignalMuons.size() == 1 && SignalMuons[0]->dr(Elec) >= 0.1 ) { VetoedElectronsDeltaR.push_back(Elec); }
|
---|
186 | }
|
---|
187 | }
|
---|
188 |
|
---|
189 |
|
---|
190 | // Jet
|
---|
191 | std::vector<const RecJetFormat*> Jets;
|
---|
192 | for (unsigned int i=0; i<event.rec()->jets().size(); i++) {
|
---|
193 | const RecJetFormat *Jet = &(event.rec()->jets()[i]);
|
---|
194 | double eta = Jet->abseta();
|
---|
195 | double pt = Jet->pt();
|
---|
196 | if ( eta < 2.4 && pt > 20. ) { Jets.push_back(Jet); }
|
---|
197 | else if ( eta > 2.4 && pt > 30. ) { Jets.push_back(Jet); }
|
---|
198 | }
|
---|
199 | Jets = PHYSICS->Isol->JetCleaning(Jets, SignalElectrons, 0.1);
|
---|
200 |
|
---|
201 |
|
---|
202 | // MET & MT
|
---|
203 | double MET = event.rec()->MET().pt();
|
---|
204 |
|
---|
205 | double Mt = 0;
|
---|
206 | if ( SignalElectrons.size() == 1 && SignalMuons.size() == 0) { Mt = sqrt(2*SignalElectrons[0]->pt()*MET*(1-cos(SignalElectrons[0]->dphi_0_pi(event.rec()->MET())))); }
|
---|
207 | else if ( SignalMuons.size() == 1 && SignalElectrons.size() == 0) { Mt = sqrt(2*SignalMuons[0]->pt()*MET*(1-cos(SignalMuons[0]->dphi_0_pi(event.rec()->MET())))); }
|
---|
208 |
|
---|
209 |
|
---|
210 | // Cuts
|
---|
211 | if (!Manager()->ApplyCut( SignalElectrons.size() == 1 && SignalMuons.size() == 0, "One Electron")) return true;
|
---|
212 | if (!Manager()->ApplyCut( SignalMuons.size() == 1 && SignalElectrons.size() == 0, "One Muon")) return true;
|
---|
213 |
|
---|
214 | if (!Manager()->ApplyCut( VetoedElectrons.size() == 0 && VetoedMuons.size() == 0, "Lepton Veto for Electrons" )) return true;
|
---|
215 | if (!Manager()->ApplyCut( VetoedElectronsDeltaR.size() == 0 && VetoedMuons.size() == 0, "Lepton Veto for Muons" )) return true;
|
---|
216 |
|
---|
217 | if (!Manager()->ApplyCut( MET > 55., "$\\slashed{E}_T > 55$ [GeV]")) return true;
|
---|
218 | if (!Manager()->ApplyCut( MET > 65., "$\\slashed{E}_T > 65$ [GeV]")) return true;
|
---|
219 | if (!Manager()->ApplyCut( Mt > 110., "$M_T > 110$ [GeV]")) return true;
|
---|
220 | if (!Manager()->ApplyCut( Mt > 130., "$M_T > 130$ [GeV]")) return true;
|
---|
221 |
|
---|
222 | if (!Manager()->ApplyCut( Mt > 110. && Mt < 400., "$110 < M_T < 400$ [GeV]")) return true;
|
---|
223 | if (!Manager()->ApplyCut( Mt > 130. && Mt < 400., "$130 < M_T < 400$ [GeV]")) return true;
|
---|
224 | if (!Manager()->ApplyCut( Mt > 400. && Mt < 600., "$400 < M_T < 600$ [GeV]")) return true;
|
---|
225 | if (!Manager()->ApplyCut( Mt > 600. && Mt < 1000., "$600 < M_T < 1000$ [GeV]")) return true;
|
---|
226 | if (!Manager()->ApplyCut( Mt > 1000. && Mt < 2000., "$1000 < M_T < 2000$ [GeV]")) return true;
|
---|
227 | if (!Manager()->ApplyCut( Mt > 2000. && Mt < 3000., "$2000 < M_T < 3000$ [GeV]")) return true;
|
---|
228 | if (!Manager()->ApplyCut( Mt > 3000. && Mt < 10000., "$3000 < M_T < 10000$ [GeV]")) return true;
|
---|
229 |
|
---|
230 |
|
---|
231 | // Fill Histograms
|
---|
232 | //Manager()->FillHisto("MT > 110 GeV for Muon Channel", Mt);
|
---|
233 | //Manager()->FillHisto("MT > 130 GeV for Electron Channel", Mt);
|
---|
234 |
|
---|
235 | Manager()->FillHisto("MT > 110 GeV for Muon Channel (finer log bins)", Mt);
|
---|
236 | Manager()->FillHisto("MT > 130 GeV for Electron Channel (finer log bins)", Mt);
|
---|
237 |
|
---|
238 | Manager()->FillHisto("MT > 110 GeV for Muon Channel (log bins)", Mt);
|
---|
239 | Manager()->FillHisto("MT > 130 GeV for Electron Channel (log bins)", Mt);
|
---|
240 |
|
---|
241 |
|
---|
242 | return true;
|
---|
243 | }
|
---|