| 1 | #include "SampleAnalyzer/User/Analyzer/cms_exo_17_030.h"
|
|---|
| 2 | #define cms_exo_17_030_PID 1000021
|
|---|
| 3 | using namespace MA5;
|
|---|
| 4 | using namespace std;
|
|---|
| 5 |
|
|---|
| 6 | // -----------------------------------------------------------------------------
|
|---|
| 7 | // Initialize
|
|---|
| 8 | // function called one time at the beginning of the analysis
|
|---|
| 9 | // -----------------------------------------------------------------------------
|
|---|
| 10 | bool cms_exo_17_030::Initialize(const MA5::Configuration& cfg, const std::map<std::string,std::string>& parameters)
|
|---|
| 11 | {
|
|---|
| 12 | // initialize variables, histos
|
|---|
| 13 | INFO << " <><><><><><><><><><><><><><><><><><><><><><><><><>" << endmsg;
|
|---|
| 14 | INFO << " <> Analysis: cms_exo_17_030 <>" << endmsg;
|
|---|
| 15 | INFO << " <> arXiv:1810.10092 <>" << endmsg;
|
|---|
| 16 | INFO << " <> (multijet) <>" << endmsg;
|
|---|
| 17 | INFO << " <> Recasters: KANG Yechan,Kim Jihun, <>" << endmsg;
|
|---|
| 18 | INFO << " <> Choi Jin, Yun SooHyun <>" << endmsg;
|
|---|
| 19 | INFO << " <> Contact: choij@cern.ch <>" << endmsg;
|
|---|
| 20 | INFO << " <> soohyun.yun@cern.ch <>" << endmsg;
|
|---|
| 21 | INFO << " <> jihun.k@cern.ch <>" << endmsg;
|
|---|
| 22 | INFO << " <> Based on MadAnalysis 5 v1.8 <>" << endmsg;
|
|---|
| 23 | INFO << " <><><><><><><><><><><><><><><><><><><><><><><><><>" << endmsg;
|
|---|
| 24 |
|
|---|
| 25 | // Initial setting for the mother particle
|
|---|
| 26 | WARNING << "Triplets will be matched to the particle with PID " << cms_exo_17_030_PID << endmsg;
|
|---|
| 27 | WARNING << "Change cms_exo_17_030_PID for your triplets" << endmsg;
|
|---|
| 28 |
|
|---|
| 29 | // Declaration of the signal regions (SR)
|
|---|
| 30 | Manager()->AddRegionSelection("Mg_200to400");
|
|---|
| 31 | Manager()->AddRegionSelection("Mg_400to700");
|
|---|
| 32 | Manager()->AddRegionSelection("Mg_700to1200");
|
|---|
| 33 | Manager()->AddRegionSelection("Mg_1200to2000");
|
|---|
| 34 |
|
|---|
| 35 | // initialize the bins
|
|---|
| 36 | for (unsigned int i = 0; i < nBins_SR1; i++) {
|
|---|
| 37 | unsigned int this_bin_left = (firstBin_SR1 + i*binsize_SR1);
|
|---|
| 38 | unsigned int this_bin_right = this_bin_left + binsize_SR1;
|
|---|
| 39 | string this_bin = "SR1: " + to_string(this_bin_left) + "to" + to_string(this_bin_right);
|
|---|
| 40 | string this_cut = "SR1: " + to_string(this_bin_left) + " < M(jjj) < " + to_string(this_bin_right);
|
|---|
| 41 | bins_SR1.push_back(this_bin);
|
|---|
| 42 | cuts_SR1.push_back(this_cut);
|
|---|
| 43 | Manager()->AddRegionSelection(bins_SR1.at(i));
|
|---|
| 44 |
|
|---|
| 45 | }
|
|---|
| 46 |
|
|---|
| 47 | for (unsigned int i = 0; i < nBins_SR2; i++) {
|
|---|
| 48 | unsigned int this_bin_left = (firstBin_SR2 + i*binsize_SR2);
|
|---|
| 49 | unsigned int this_bin_right = this_bin_left + binsize_SR2;
|
|---|
| 50 | string this_bin = "SR2: " + to_string(this_bin_left) + "to" + to_string(this_bin_right);
|
|---|
| 51 | string this_cut = "SR2: " + to_string(this_bin_left) + " < M(jjj) < " + to_string(this_bin_right);
|
|---|
| 52 | bins_SR2.push_back(this_bin);
|
|---|
| 53 | cuts_SR2.push_back(this_cut);
|
|---|
| 54 | Manager()->AddRegionSelection(bins_SR2.at(i));
|
|---|
| 55 | }
|
|---|
| 56 |
|
|---|
| 57 | for (unsigned int i = 0; i < nBins_SR3; i++) {
|
|---|
| 58 | unsigned int this_bin_left = (firstBin_SR3 + i*binsize_SR3);
|
|---|
| 59 | unsigned int this_bin_right = this_bin_left + binsize_SR3;
|
|---|
| 60 | string this_bin = "SR3: " + to_string(this_bin_left) + "to" + to_string(this_bin_right);
|
|---|
| 61 | string this_cut = "SR3: " + to_string(this_bin_left) + " < M(jjj) < " + to_string(this_bin_right);
|
|---|
| 62 | bins_SR3.push_back(this_bin);
|
|---|
| 63 | cuts_SR3.push_back(this_cut);
|
|---|
| 64 | Manager()->AddRegionSelection(bins_SR3.at(i));
|
|---|
| 65 | }
|
|---|
| 66 |
|
|---|
| 67 | for (unsigned int i = 0; i < nBins_SR4; i++) {
|
|---|
| 68 | unsigned int this_bin_left = (firstBin_SR4 + i*binsize_SR4);
|
|---|
| 69 | unsigned int this_bin_right = this_bin_left + binsize_SR4;
|
|---|
| 70 | string this_bin = "SR4: " + to_string(this_bin_left) + "to" + to_string(this_bin_right);
|
|---|
| 71 | string this_cut = "SR4: " + to_string(this_bin_left) + " < M(jjj) < " + to_string(this_bin_right);
|
|---|
| 72 | bins_SR4.push_back(this_bin);
|
|---|
| 73 | cuts_SR4.push_back(this_cut);
|
|---|
| 74 | Manager()->AddRegionSelection(bins_SR4.at(i));
|
|---|
| 75 | }
|
|---|
| 76 |
|
|---|
| 77 | // Signal Region Partitions
|
|---|
| 78 | // All Regions
|
|---|
| 79 | std::string All_Region[103];
|
|---|
| 80 | All_Region[0] = "Mg_200to400";
|
|---|
| 81 | All_Region[1] = "Mg_400to700";
|
|---|
| 82 | All_Region[2] = "Mg_700to1200";
|
|---|
| 83 | All_Region[3] = "Mg_1200to2000";
|
|---|
| 84 |
|
|---|
| 85 | for (unsigned int i = 0; i < nBins_SR1; i++) {
|
|---|
| 86 | All_Region[4+i] = bins_SR1.at(i);
|
|---|
| 87 | }
|
|---|
| 88 | for (unsigned int i = 0; i < nBins_SR2; i++) {
|
|---|
| 89 | All_Region[4+nBins_SR1+i] = bins_SR2.at(i);
|
|---|
| 90 | }
|
|---|
| 91 | for (unsigned int i = 0; i < nBins_SR3; i++) {
|
|---|
| 92 | All_Region[4+nBins_SR1+nBins_SR2+i] = bins_SR3.at(i);
|
|---|
| 93 | }
|
|---|
| 94 | for (unsigned int i = 0; i < nBins_SR4; i++) {
|
|---|
| 95 | All_Region[4+nBins_SR1+nBins_SR2+nBins_SR3+i] = bins_SR4.at(i);
|
|---|
| 96 | }
|
|---|
| 97 |
|
|---|
| 98 | // Low Mass Regions
|
|---|
| 99 | std::string Low_Mass_Region[64];
|
|---|
| 100 | Low_Mass_Region[0] = "Mg_200to400";
|
|---|
| 101 | Low_Mass_Region[1] = "Mg_400to700";
|
|---|
| 102 | for (unsigned int i = 0; i < nBins_SR1; i++)
|
|---|
| 103 | Low_Mass_Region[2+i] = bins_SR1.at(i);
|
|---|
| 104 | for (unsigned int i = 0; i < nBins_SR2; i++)
|
|---|
| 105 | Low_Mass_Region[2+nBins_SR1+i] = bins_SR2.at(i);
|
|---|
| 106 |
|
|---|
| 107 | // High Mass Regions
|
|---|
| 108 | std::string High_Mass_Region[39];
|
|---|
| 109 | High_Mass_Region[0] = "Mg_700to1200";
|
|---|
| 110 | High_Mass_Region[1] = "Mg_1200to2000";
|
|---|
| 111 | for (unsigned int i = 0; i < nBins_SR3; i++)
|
|---|
| 112 | High_Mass_Region[2+i] = bins_SR3.at(i);
|
|---|
| 113 | for (unsigned int i = 0; i < nBins_SR4; i++)
|
|---|
| 114 | High_Mass_Region[2+nBins_SR3+i] = bins_SR4.at(i);
|
|---|
| 115 |
|
|---|
| 116 | // SR1
|
|---|
| 117 | std::string SR1[31];
|
|---|
| 118 | SR1[0] = "Mg_200to400";
|
|---|
| 119 | for (unsigned int i = 0; i < nBins_SR1; i++)
|
|---|
| 120 | SR1[1+i] = bins_SR1.at(i);
|
|---|
| 121 |
|
|---|
| 122 | // SR2
|
|---|
| 123 | std::string SR2[33];
|
|---|
| 124 | SR2[0] = "Mg_400to700";
|
|---|
| 125 | for (unsigned int i = 0; i < nBins_SR2; i++)
|
|---|
| 126 | SR2[1+i] = bins_SR2.at(i);
|
|---|
| 127 |
|
|---|
| 128 | // SR3
|
|---|
| 129 | std::string SR3[18];
|
|---|
| 130 | SR3[0] = "Mg_700to1200";
|
|---|
| 131 | for (unsigned int i = 0; i < nBins_SR3; i++)
|
|---|
| 132 | SR3[1+i] = bins_SR3.at(i);
|
|---|
| 133 |
|
|---|
| 134 | // SR4
|
|---|
| 135 | std::string SR4[21];
|
|---|
| 136 | SR4[0] = "Mg_1200to2000";
|
|---|
| 137 | for (unsigned int i = 0; i < nBins_SR4; i++)
|
|---|
| 138 | SR4[1+i] = bins_SR4.at(i);
|
|---|
| 139 |
|
|---|
| 140 | // Declaration of the preselection and HT cuts
|
|---|
| 141 | Manager()->AddCut("ALL: Njets>=6", All_Region);
|
|---|
| 142 |
|
|---|
| 143 | Manager()->AddCut("LOW: preselection", Low_Mass_Region);
|
|---|
| 144 | Manager()->AddCut("HIGH: preselection", High_Mass_Region);
|
|---|
| 145 |
|
|---|
| 146 | Manager()->AddCut("LOW: HT > 650GeV", Low_Mass_Region);
|
|---|
| 147 | Manager()->AddCut("HIGH: HT > 900GeV", High_Mass_Region);
|
|---|
| 148 |
|
|---|
| 149 | // Declaration of the sixth jet-pt cut
|
|---|
| 150 | Manager()->AddCut("SR1: pt(j6) > 40GeV", SR1);
|
|---|
| 151 | Manager()->AddCut("SR2: pt(j6) > 50GeV", SR2);
|
|---|
| 152 | Manager()->AddCut("SR3: pt(j6) > 125GeV", SR3);
|
|---|
| 153 | Manager()->AddCut("SR4: pt(j6) > 175GeV", SR4);
|
|---|
| 154 |
|
|---|
| 155 | // Declaration of the D^2[6,3+3,2] cut
|
|---|
| 156 | Manager()->AddCut("SR1: D^2[6,3+3,2] < 1.25", SR1);
|
|---|
| 157 | Manager()->AddCut("SR2: D^2[6,3+3,2] < 1.0", SR2);
|
|---|
| 158 | Manager()->AddCut("SR3: D^2[6,3+3,2] < 0.9", SR3);
|
|---|
| 159 | Manager()->AddCut("SR4: D^2[6,3+3,2] < 0.75", SR4);
|
|---|
| 160 |
|
|---|
| 161 | // Declaration of the Am cut - TripletPair cut
|
|---|
| 162 | Manager()->AddCut("SR1: Am < 0.25", SR1);
|
|---|
| 163 | Manager()->AddCut("SR2: Am < 0.175", SR2);
|
|---|
| 164 | Manager()->AddCut("SR3: Am < 0.15", SR3);
|
|---|
| 165 | Manager()->AddCut("SR4: Am < 0.15", SR4);
|
|---|
| 166 |
|
|---|
| 167 | // Declaration of the Delta cut - Triplet cut
|
|---|
| 168 | Manager()->AddCut("SR1: Delta > 250GeV", SR1);
|
|---|
| 169 | Manager()->AddCut("SR2: Delta > 180GeV", SR2);
|
|---|
| 170 | Manager()->AddCut("SR3: Delta > 20GeV", SR3);
|
|---|
| 171 | Manager()->AddCut("SR4: Delta > -120GeV", SR4);
|
|---|
| 172 |
|
|---|
| 173 | // Declaration of the D^2[3,2] cut - Triplet cut
|
|---|
| 174 | Manager()->AddCut("SR1: D^2[3,2] < 0.05", SR1);
|
|---|
| 175 | Manager()->AddCut("SR2: D^2[3,2] < 0.175", SR2);
|
|---|
| 176 | Manager()->AddCut("SR3: D^2[3,2] < 0.2", SR3);
|
|---|
| 177 | Manager()->AddCut("SR4: D^2[3,2] < 0.25", SR4);
|
|---|
| 178 |
|
|---|
| 179 | // mass partition
|
|---|
| 180 | Manager()->AddHisto("SR1: M(jjj)", 200, 200., 400.);
|
|---|
| 181 | Manager()->AddHisto("SR2: M(jjj)", 300, 400., 700.);
|
|---|
| 182 | Manager()->AddHisto("SR3: M(jjj)", 500, 700., 1200.);
|
|---|
| 183 | Manager()->AddHisto("SR4: M(jjj)", 800, 1200., 2000.);
|
|---|
| 184 |
|
|---|
| 185 | // Declaration of mass mins
|
|---|
| 186 | for (unsigned int i = 0; i < nBins_SR1; i++)
|
|---|
| 187 | Manager()->AddCut(cuts_SR1[i], bins_SR1[i]);
|
|---|
| 188 |
|
|---|
| 189 | for (unsigned int i = 0; i < nBins_SR2; i++)
|
|---|
| 190 | Manager()->AddCut(cuts_SR2[i], bins_SR2[i]);
|
|---|
| 191 |
|
|---|
| 192 | for (unsigned int i = 0; i < nBins_SR3; i++)
|
|---|
| 193 | Manager()->AddCut(cuts_SR3[i], bins_SR3[i]);
|
|---|
| 194 |
|
|---|
| 195 | for (unsigned int i = 0; i < nBins_SR4; i++)
|
|---|
| 196 | Manager()->AddCut(cuts_SR4[i], bins_SR4[i]);
|
|---|
| 197 |
|
|---|
| 198 | return true;
|
|---|
| 199 | }
|
|---|
| 200 |
|
|---|
| 201 | // -----------------------------------------------------------------------------
|
|---|
| 202 | // Finalize
|
|---|
| 203 | // function called one time at the end of the analysis
|
|---|
| 204 | // -----------------------------------------------------------------------------
|
|---|
| 205 | void cms_exo_17_030::Finalize(const SampleFormat& summary, const std::vector<SampleFormat>& files) {}
|
|---|
| 206 |
|
|---|
| 207 | // -----------------------------------------------------------------------------
|
|---|
| 208 | // Execute
|
|---|
| 209 | // function called each time one event is read
|
|---|
| 210 | // -----------------------------------------------------------------------------
|
|---|
| 211 | bool cms_exo_17_030::Execute(SampleFormat& sample, const EventFormat& event)
|
|---|
| 212 | {
|
|---|
| 213 | // Event weight
|
|---|
| 214 | double weight;
|
|---|
| 215 | if (Configuration().IsNoEventWeight()) weight = 1.;
|
|---|
| 216 | else if (event.mc()->weight() != 0.) weight = event.mc()->weight();
|
|---|
| 217 | else return false;
|
|---|
| 218 |
|
|---|
| 219 | const double nTrips = 20.;
|
|---|
| 220 | const int nRegions = 4;
|
|---|
| 221 | Manager()->InitializeForNewEvent(weight*nTrips);
|
|---|
| 222 |
|
|---|
| 223 | const double ptCut[] = {30, 30, 50, 50};
|
|---|
| 224 | const double HTcut[] = {650, 650, 900, 900};
|
|---|
| 225 | const double j6ptCut[] = {40, 50, 125, 175};
|
|---|
| 226 | const double mds6332Cut[] = {1.25, 1., 0.9, 0.75};
|
|---|
| 227 | const double asymmCut[] = {0.25, 0.175, 0.15, 0.15};
|
|---|
| 228 | const double deltaCut[] = {250, 180, 20, -120};
|
|---|
| 229 | const double mds32Cut[] = {0.05, 0.175, 0.2, 0.25};
|
|---|
| 230 |
|
|---|
| 231 | // The event loop start here
|
|---|
| 232 | if(event.rec() == 0) return true;
|
|---|
| 233 |
|
|---|
| 234 | // Select jets satisfying pt&eta cut
|
|---|
| 235 | const double etaCut = 2.4;
|
|---|
| 236 | const double basePtCut = 20.;
|
|---|
| 237 | JetCollection jets = jetSelection(event, basePtCut, etaCut);
|
|---|
| 238 | SORTER->sort(jets);
|
|---|
| 239 |
|
|---|
| 240 | // Nj cut for low and high mass regions
|
|---|
| 241 | if(!Manager()->ApplyCut(jets.size() >= 6, "ALL: Njets>=6")) return true;
|
|---|
| 242 |
|
|---|
| 243 | // confirm jet pt cut
|
|---|
| 244 | if(!Manager()->ApplyCut(jets.at(5)->pt() > ptCut[0], "LOW: preselection")) return true;
|
|---|
| 245 | if(!Manager()->ApplyCut(jets.at(5)->pt() > ptCut[2], "HIGH: preselection")) return true;
|
|---|
| 246 |
|
|---|
| 247 | // HT, j6pt cut
|
|---|
| 248 | double H_T = HT(jets);
|
|---|
| 249 | double j6pt = jets.at(5)->pt();
|
|---|
| 250 |
|
|---|
| 251 | // HT cut for low and high mass regions
|
|---|
| 252 | if(!Manager()->ApplyCut(H_T > HTcut[0], "LOW: HT > 650GeV")) return true;
|
|---|
| 253 | if(!Manager()->ApplyCut(H_T > HTcut[2], "HIGH: HT > 900GeV")) return true;
|
|---|
| 254 |
|
|---|
| 255 | // 6th Jet Pt cut for each regions
|
|---|
| 256 | if(!Manager()->ApplyCut(j6pt > j6ptCut[0], "SR1: pt(j6) > 40GeV") ) return true;
|
|---|
| 257 | if(!Manager()->ApplyCut(j6pt > j6ptCut[1], "SR2: pt(j6) > 50GeV") ) return true;
|
|---|
| 258 | if(!Manager()->ApplyCut(j6pt > j6ptCut[2], "SR3: pt(j6) > 125GeV")) return true;
|
|---|
| 259 | if(!Manager()->ApplyCut(j6pt > j6ptCut[3], "SR4: pt(j6) > 175GeV")) return true;
|
|---|
| 260 |
|
|---|
| 261 | // Mds6332 cut
|
|---|
| 262 | double evtMds6332 = mds6332(jets);
|
|---|
| 263 |
|
|---|
| 264 | if(!Manager()->ApplyCut(evtMds6332 < mds6332Cut[0], "SR1: D^2[6,3+3,2] < 1.25")) return true;
|
|---|
| 265 | if(!Manager()->ApplyCut(evtMds6332 < mds6332Cut[1], "SR2: D^2[6,3+3,2] < 1.0") ) return true;
|
|---|
| 266 | if(!Manager()->ApplyCut(evtMds6332 < mds6332Cut[2], "SR3: D^2[6,3+3,2] < 0.9") ) return true;
|
|---|
| 267 | if(!Manager()->ApplyCut(evtMds6332 < mds6332Cut[3], "SR4: D^2[6,3+3,2] < 0.75")) return true;
|
|---|
| 268 |
|
|---|
| 269 |
|
|---|
| 270 | // Mass asymmetry cut
|
|---|
| 271 | PairCollection tripPairs = makePairCollection(jets);
|
|---|
| 272 | TripletCollection trips[nRegions];
|
|---|
| 273 | for (int i = 0; i < nRegions; i++) {
|
|---|
| 274 | trips[i] = pairSelection(tripPairs, asymmCut[i]);
|
|---|
| 275 | trips[i] = GenMatchedTriplets(event, trips[i]);
|
|---|
| 276 | }
|
|---|
| 277 |
|
|---|
| 278 | double nTrips_passAsymm[nRegions];
|
|---|
| 279 | for (int i = 0; i < nRegions; i++)
|
|---|
| 280 | nTrips_passAsymm[i] = trips[i].size();
|
|---|
| 281 |
|
|---|
| 282 | // starting to implement triplet size as weight
|
|---|
| 283 | Manager()->SetCurrentEventWeight(weight*nTrips_passAsymm[0]);
|
|---|
| 284 | if(!Manager()->ApplyCut(trips[0].size() != 0, "SR1: Am < 0.25")) return true;
|
|---|
| 285 | Manager()->SetCurrentEventWeight(weight*nTrips_passAsymm[1]);
|
|---|
| 286 | if(!Manager()->ApplyCut(trips[1].size() != 0, "SR2: Am < 0.175")) return true;
|
|---|
| 287 | Manager()->SetCurrentEventWeight(weight*nTrips_passAsymm[2]);
|
|---|
| 288 | if(!Manager()->ApplyCut(trips[2].size() != 0, "SR3: Am < 0.15")) return true;
|
|---|
| 289 | Manager()->SetCurrentEventWeight(weight*nTrips_passAsymm[3]);
|
|---|
| 290 | Manager()->SetCurrentEventWeight(weight*trips[3].size());
|
|---|
| 291 | if(!Manager()->ApplyCut(trips[3].size() != 0, "SR4: Am < 0.15")) return true;
|
|---|
| 292 |
|
|---|
| 293 | // Delta cut
|
|---|
| 294 | double nTrips_passDelta[nRegions];
|
|---|
| 295 | for (int i = 0; i < nRegions; i++) {
|
|---|
| 296 | // select triplets
|
|---|
| 297 | trips[i] = deltaSelection(trips[i], deltaCut[i]);
|
|---|
| 298 |
|
|---|
| 299 | // update nTrips
|
|---|
| 300 | nTrips_passDelta[i] = trips[i].size();
|
|---|
| 301 | }
|
|---|
| 302 |
|
|---|
| 303 | Manager()->SetCurrentEventWeight(weight*nTrips_passDelta[0]);
|
|---|
| 304 | if(!Manager()->ApplyCut(trips[0].size() != 0, "SR1: Delta > 250GeV")) return true;
|
|---|
| 305 | Manager()->SetCurrentEventWeight(weight*nTrips_passDelta[1]);
|
|---|
| 306 | if(!Manager()->ApplyCut(trips[1].size() != 0, "SR2: Delta > 180GeV")) return true;
|
|---|
| 307 | Manager()->SetCurrentEventWeight(weight*nTrips_passDelta[2]);
|
|---|
| 308 | if(!Manager()->ApplyCut(trips[2].size() != 0, "SR3: Delta > 20GeV")) return true;
|
|---|
| 309 | Manager()->SetCurrentEventWeight(weight*nTrips_passDelta[3]);
|
|---|
| 310 | if(!Manager()->ApplyCut(trips[3].size() != 0, "SR4: Delta > -120GeV")) return true;
|
|---|
| 311 |
|
|---|
| 312 | // mds32 cut
|
|---|
| 313 | double nTrips_passMDS32[nRegions];
|
|---|
| 314 | for (int i = 0; i < nRegions; i++) {
|
|---|
| 315 | // select triplets
|
|---|
| 316 | trips[i] = mds32Selection(trips[i], mds32Cut[i]);
|
|---|
| 317 |
|
|---|
| 318 | // update nTrips
|
|---|
| 319 | nTrips_passMDS32[i] = trips[i].size();
|
|---|
| 320 | }
|
|---|
| 321 |
|
|---|
| 322 | Manager()->SetCurrentEventWeight(weight*nTrips_passMDS32[0]);
|
|---|
| 323 | if(!Manager()->ApplyCut(trips[0].size() != 0, "SR1: D^2[3,2] < 0.05")) return true;
|
|---|
| 324 | Manager()->SetCurrentEventWeight(weight*nTrips_passMDS32[1]);
|
|---|
| 325 | if(!Manager()->ApplyCut(trips[1].size() != 0, "SR2: D^2[3,2] < 0.175")) return true;
|
|---|
| 326 | Manager()->SetCurrentEventWeight(weight*nTrips_passMDS32[2]);
|
|---|
| 327 | if(!Manager()->ApplyCut(trips[2].size() != 0, "SR3: D^2[3,2] < 0.2")) return true;
|
|---|
| 328 | Manager()->SetCurrentEventWeight(weight*nTrips_passMDS32[3]);
|
|---|
| 329 | if(!Manager()->ApplyCut(trips[3].size() != 0, "SR4: D^2[3,2] < 0.25")) return true;
|
|---|
| 330 |
|
|---|
| 331 | // Filling Histo
|
|---|
| 332 | Manager()->SetCurrentEventWeight(weight);
|
|---|
| 333 | unsigned int nTrips_SR1[nBins_SR1] = {0}, nTrips_SR2[nBins_SR2] = {0}, nTrips_SR3[nBins_SR3] = {0}, nTrips_SR4[nBins_SR4] = {0};
|
|---|
| 334 |
|
|---|
| 335 | for (unsigned int i = 0; i < trips[0].size(); i++) {
|
|---|
| 336 | Manager()->FillHisto("SR1: M(jjj)", mass(trips[0].at(i)));
|
|---|
| 337 |
|
|---|
| 338 | // prepare for region selector
|
|---|
| 339 | double this_mass = mass(trips[0].at(i));
|
|---|
| 340 | unsigned int this_bin = (((int)this_mass) - firstBin_SR1) / binsize_SR1;
|
|---|
| 341 | if (! (this_bin&&this_bin<nBins_SR1))
|
|---|
| 342 | continue;
|
|---|
| 343 | nTrips_SR1[this_bin]++;
|
|---|
| 344 | }
|
|---|
| 345 |
|
|---|
| 346 | for (unsigned int i = 0; i < trips[1].size(); i++) {
|
|---|
| 347 | Manager()->FillHisto("SR2: M(jjj)", mass(trips[1].at(i)));
|
|---|
| 348 |
|
|---|
| 349 | // prepare for region selector
|
|---|
| 350 | double this_mass = mass(trips[1].at(i));
|
|---|
| 351 | unsigned int this_bin = (((int)this_mass)-firstBin_SR2) / binsize_SR2;
|
|---|
| 352 | if (! (this_bin&&this_bin<nBins_SR2))
|
|---|
| 353 | continue;
|
|---|
| 354 | nTrips_SR2[this_bin]++;
|
|---|
| 355 | }
|
|---|
| 356 |
|
|---|
| 357 | for (unsigned int i = 0; i < trips[2].size(); i++) {
|
|---|
| 358 | Manager()->FillHisto("SR3: M(jjj)", mass(trips[2].at(i)));
|
|---|
| 359 |
|
|---|
| 360 | // prepare for region selector
|
|---|
| 361 | double this_mass = mass(trips[2].at(i));
|
|---|
| 362 | unsigned int this_bin = (((int)this_mass)-firstBin_SR3) / binsize_SR3;
|
|---|
| 363 | if (! (this_bin&&this_bin<nBins_SR3))
|
|---|
| 364 | continue;
|
|---|
| 365 | nTrips_SR3[this_bin]++;
|
|---|
| 366 | }
|
|---|
| 367 |
|
|---|
| 368 | for (unsigned int i = 0; i < trips[3].size(); i++) {
|
|---|
| 369 | Manager()->FillHisto("SR4: M(jjj)", mass(trips[3].at(i)));
|
|---|
| 370 |
|
|---|
| 371 | // prepare for region selector
|
|---|
| 372 | double this_mass = mass(trips[3].at(i));
|
|---|
| 373 | unsigned int this_bin = (((int)this_mass)-firstBin_SR4) / binsize_SR4;
|
|---|
| 374 | if (! (this_bin&&this_bin<nBins_SR4))
|
|---|
| 375 | continue;
|
|---|
| 376 | nTrips_SR4[this_bin]++;
|
|---|
| 377 | }
|
|---|
| 378 |
|
|---|
| 379 | // Final mass bin
|
|---|
| 380 | for (unsigned int i = 0; i < nBins_SR1; i++) {
|
|---|
| 381 | Manager()->SetCurrentEventWeight(weight*(double)nTrips_SR1[i]);
|
|---|
| 382 | if(!Manager()->ApplyCut(nTrips_SR1[i] != 0, cuts_SR1[i])) return true;
|
|---|
| 383 | }
|
|---|
| 384 |
|
|---|
| 385 | for (unsigned int i = 0; i < nBins_SR2; i++) {
|
|---|
| 386 | Manager()->SetCurrentEventWeight(weight*(double)nTrips_SR2[i]);
|
|---|
| 387 | if(!Manager()->ApplyCut(nTrips_SR2[i] != 0, cuts_SR2[i])) return true;
|
|---|
| 388 | }
|
|---|
| 389 |
|
|---|
| 390 | for (unsigned int i = 0; i < nBins_SR3; i++) {
|
|---|
| 391 | Manager()->SetCurrentEventWeight(weight*(double)nTrips_SR3[i]);
|
|---|
| 392 | if(!Manager()->ApplyCut(nTrips_SR3[i] != 0, cuts_SR3[i])) return true;
|
|---|
| 393 | }
|
|---|
| 394 |
|
|---|
| 395 | for (unsigned int i = 0; i < nBins_SR4; i++) {
|
|---|
| 396 | Manager()->SetCurrentEventWeight(weight*(double)nTrips_SR4[i]);
|
|---|
| 397 | if (!Manager()->ApplyCut(nTrips_SR4[i] != 0, cuts_SR4[i])) return true;
|
|---|
| 398 | }
|
|---|
| 399 |
|
|---|
| 400 | return true;
|
|---|
| 401 | }
|
|---|
| 402 |
|
|---|
| 403 | //==== Functions to use
|
|---|
| 404 | //==== 1. kinematic variables
|
|---|
| 405 | MALorentzVector cms_exo_17_030::momentum(const Triplet &trip) {
|
|---|
| 406 | return trip[0]->momentum() + trip[1]->momentum() + trip[2]->momentum();
|
|---|
| 407 | }
|
|---|
| 408 |
|
|---|
| 409 | double cms_exo_17_030::mass(const Triplet &trip) {
|
|---|
| 410 | MALorentzVector mom = momentum(trip);
|
|---|
| 411 | return mom.M();
|
|---|
| 412 | }
|
|---|
| 413 |
|
|---|
| 414 | double cms_exo_17_030::HT(const JetCollection &jetcoll) {
|
|---|
| 415 | double this_HT = 0;
|
|---|
| 416 | for (unsigned int i = 0; i < jetcoll.size(); i++)
|
|---|
| 417 | this_HT += jetcoll.at(i)->pt();
|
|---|
| 418 |
|
|---|
| 419 | return this_HT;
|
|---|
| 420 | }
|
|---|
| 421 |
|
|---|
| 422 | double cms_exo_17_030::dalitz32(const Triplet &trip, const int &idx1, const int &idx2) {
|
|---|
| 423 | double M = pow((trip[idx1]->momentum()+trip[idx2]->momentum()).M(), 2);
|
|---|
| 424 | double M_123 = pow((trip[0]->momentum()+trip[1]->momentum()+trip[2]->momentum()).M(), 2);
|
|---|
| 425 | double M_1 = pow((trip[0]->momentum()).M(), 2);
|
|---|
| 426 | double M_2 = pow((trip[1]->momentum()).M(), 2);
|
|---|
| 427 | double M_3 = pow((trip[2]->momentum()).M(), 2);
|
|---|
| 428 | return M/(M_123+M_1+M_2+M_3);
|
|---|
| 429 | }
|
|---|
| 430 |
|
|---|
| 431 | double cms_exo_17_030::mds32(const Triplet &trip) {
|
|---|
| 432 | double c = 1./sqrt(3.);
|
|---|
| 433 | double out = 0.;
|
|---|
| 434 | for (int i = 0; i < 3; i++) {
|
|---|
| 435 | for (int j = i+1; j < 3; j++) {
|
|---|
| 436 | out += pow( sqrt(dalitz32(trip, i, j))-c, 2);
|
|---|
| 437 | }
|
|---|
| 438 | }
|
|---|
| 439 | return out;
|
|---|
| 440 | }
|
|---|
| 441 |
|
|---|
| 442 | double cms_exo_17_030::dalitz6332(const JetCollection &jetcoll, const int &idx1, const int &idx2, const int &idx3) {
|
|---|
| 443 | double M = pow((jetcoll.at(idx1)->momentum() + jetcoll.at(idx2)->momentum() + jetcoll.at(idx3)->momentum() ).M(), 2);
|
|---|
| 444 | MALorentzVector PTv;
|
|---|
| 445 | double massSum = 0;
|
|---|
| 446 | for (int i = 0; i < 6; i++) {
|
|---|
| 447 | PTv += jetcoll.at(i)->momentum();
|
|---|
| 448 | massSum += pow((jetcoll.at(i)->momentum()).M(), 2);
|
|---|
| 449 | }
|
|---|
| 450 | double M_inv = pow(PTv.M(), 2);
|
|---|
| 451 |
|
|---|
| 452 | return M / (4*M_inv + 6*massSum);
|
|---|
| 453 | }
|
|---|
| 454 |
|
|---|
| 455 | double cms_exo_17_030::mds6332(const JetCollection &jetcoll) {
|
|---|
| 456 | double out = 0; double c = 1./sqrt(20.);
|
|---|
| 457 |
|
|---|
| 458 | for (int i = 0; i < 6; i++) {
|
|---|
| 459 | for (int j = i+1; j < 6; j++) {
|
|---|
| 460 | for (int k = j+1; k < 6; k++) {
|
|---|
| 461 | Triplet this_trip = {jetcoll.at(i), jetcoll.at(j), jetcoll.at(k)};
|
|---|
| 462 | double this_sum = dalitz6332(jetcoll, i, j, k) + mds32(this_trip);
|
|---|
| 463 | this_sum = sqrt(this_sum) - c;
|
|---|
| 464 | out += pow(this_sum, 2);
|
|---|
| 465 | }
|
|---|
| 466 | }
|
|---|
| 467 | }
|
|---|
| 468 | return out;
|
|---|
| 469 | }
|
|---|
| 470 |
|
|---|
| 471 | double cms_exo_17_030::massAsymm(const TripletPair &pair) {
|
|---|
| 472 | double mass1 = mass(pair.first);
|
|---|
| 473 | double mass2 = mass(pair.second);
|
|---|
| 474 |
|
|---|
| 475 | return fabs(mass1 - mass2) / (mass1 + mass2);
|
|---|
| 476 | }
|
|---|
| 477 |
|
|---|
| 478 | double cms_exo_17_030::delta(const Triplet &trip) {
|
|---|
| 479 | double this_HT = 0.;
|
|---|
| 480 | for (unsigned int i = 0; i < trip.size(); i++)
|
|---|
| 481 | this_HT += trip.at(i)->pt();
|
|---|
| 482 |
|
|---|
| 483 | double this_mass = mass(trip);
|
|---|
| 484 |
|
|---|
| 485 | return this_HT - this_mass;
|
|---|
| 486 | }
|
|---|
| 487 |
|
|---|
| 488 | //==== 2. selections
|
|---|
| 489 | JetCollection cms_exo_17_030::jetSelection(const EventFormat &event, const double &ptCut, const double &etaCut) {
|
|---|
| 490 | JetCollection out;
|
|---|
| 491 |
|
|---|
| 492 | for (unsigned int i = 0; i < (event.rec()->jets()).size(); i++) {
|
|---|
| 493 | const RecJetFormat& this_jet = (event.rec()->jets()).at(i);
|
|---|
| 494 | if ((this_jet.pt() > ptCut) && (fabs(this_jet.eta()) < etaCut))
|
|---|
| 495 | out.push_back(&this_jet);
|
|---|
| 496 | }
|
|---|
| 497 |
|
|---|
| 498 | return out;
|
|---|
| 499 | }
|
|---|
| 500 |
|
|---|
| 501 | TripletCollection cms_exo_17_030::pairSelection(const PairCollection &pairs, const double &asymmCut) {
|
|---|
| 502 | TripletCollection out;
|
|---|
| 503 |
|
|---|
| 504 | for (unsigned int i = 0; i < pairs.size(); i++) {
|
|---|
| 505 | const TripletPair& this_pair = pairs.at(i);
|
|---|
| 506 | if (massAsymm(this_pair) < asymmCut) {
|
|---|
| 507 | out.push_back(this_pair.first);
|
|---|
| 508 | out.push_back(this_pair.second);
|
|---|
| 509 | }
|
|---|
| 510 | }
|
|---|
| 511 |
|
|---|
| 512 | return out;
|
|---|
| 513 | }
|
|---|
| 514 |
|
|---|
| 515 | TripletCollection cms_exo_17_030::deltaSelection(const TripletCollection &trips, const double &deltaCut) {
|
|---|
| 516 | TripletCollection out;
|
|---|
| 517 |
|
|---|
| 518 | for (unsigned int i = 0; i < trips.size(); i++) {
|
|---|
| 519 | const Triplet& this_trip = trips.at(i);
|
|---|
| 520 | if (delta(this_trip) > deltaCut)
|
|---|
| 521 | out.push_back(this_trip);
|
|---|
| 522 | }
|
|---|
| 523 |
|
|---|
| 524 | return out;
|
|---|
| 525 | }
|
|---|
| 526 |
|
|---|
| 527 | TripletCollection cms_exo_17_030::mds32Selection(const TripletCollection &trips, const double &mdsCut) {
|
|---|
| 528 | TripletCollection out;
|
|---|
| 529 |
|
|---|
| 530 | for (unsigned int i = 0; i < trips.size(); i++) {
|
|---|
| 531 | const Triplet& this_trip = trips.at(i);
|
|---|
| 532 | if (mds32(this_trip) < mdsCut)
|
|---|
| 533 | out.push_back(this_trip);
|
|---|
| 534 | }
|
|---|
| 535 |
|
|---|
| 536 | return out;
|
|---|
| 537 | }
|
|---|
| 538 |
|
|---|
| 539 | //==== 3. tools
|
|---|
| 540 | PairCollection cms_exo_17_030::makePairCollection(const JetCollection &jetcoll) {
|
|---|
| 541 | PairCollection out;
|
|---|
| 542 |
|
|---|
| 543 | TripletCollection trips;
|
|---|
| 544 | for (int i = 0; i < 6; i++) {
|
|---|
| 545 | for (int j = i+1; j < 6; j++) {
|
|---|
| 546 | for (int k = j+1; k < 6; k++) {
|
|---|
| 547 | trips.push_back({jetcoll.at(i), jetcoll.at(j), jetcoll.at(k)});
|
|---|
| 548 | }
|
|---|
| 549 | }
|
|---|
| 550 | }
|
|---|
| 551 |
|
|---|
| 552 | for (int i = 0; i < 10; i++) out.push_back(make_pair(trips.at(i), trips.at(19-i)));
|
|---|
| 553 | return out;
|
|---|
| 554 | }
|
|---|
| 555 |
|
|---|
| 556 | TripletCollection cms_exo_17_030::GenMatchedTriplets(const EventFormat &event, const TripletCollection &trips) {
|
|---|
| 557 | JetCollection matched_jets1, matched_jets2, matched_jets3, matched_jets4;
|
|---|
| 558 | TripletCollection matched_trips;
|
|---|
| 559 | const vector<MCParticleFormat> &gens = event.mc()->particles();
|
|---|
| 560 | vector<const MCParticleFormat*> p_gluinos;
|
|---|
| 561 |
|
|---|
| 562 | for (unsigned int i = 0; i < gens.size(); i++) {
|
|---|
| 563 | const MCParticleFormat& gen = gens.at(i);
|
|---|
| 564 | if(gen.mothers().size()==0) continue;
|
|---|
| 565 | if (1<=gen.pdgid()&&gen.pdgid()<=4&&(gen.mothers()).at(0)->pdgid()==cms_exo_17_030_PID)
|
|---|
| 566 | p_gluinos.push_back((gen.mothers()).at(0));
|
|---|
| 567 | if (-4<=gen.pdgid()&&gen.pdgid()<=-1&&(gen.mothers()).at(0)->pdgid()==cms_exo_17_030_PID)
|
|---|
| 568 | p_gluinos.push_back((gen.mothers()).at(0));
|
|---|
| 569 | }
|
|---|
| 570 |
|
|---|
| 571 | sort(p_gluinos.begin(), p_gluinos.end());
|
|---|
| 572 | vector<const MCParticleFormat*>::iterator last;
|
|---|
| 573 | last = unique(p_gluinos.begin(), p_gluinos.end());
|
|---|
| 574 | p_gluinos.erase(last, p_gluinos.end());
|
|---|
| 575 |
|
|---|
| 576 | // start matching
|
|---|
| 577 | // triplets should be matched to the "same" mother gluino -> use the pointer comparision
|
|---|
| 578 | bool matched;
|
|---|
| 579 | for (unsigned int i = 0; i < trips.size(); i++) {
|
|---|
| 580 | for (unsigned int j = 0; j < gens.size(); j++) {
|
|---|
| 581 | const Triplet& trip = trips.at(i);
|
|---|
| 582 | const MCParticleFormat& gen = gens.at(j);
|
|---|
| 583 | if (gen.mothers().size()==0 || p_gluinos.size()==0) continue;
|
|---|
| 584 | else if (1<=gen.pdgid()&&gen.pdgid()<=4&&((gen.mothers()).at(0)==p_gluinos.at(0))) {
|
|---|
| 585 | for (unsigned int k = 0; k < trip.size(); k++) {
|
|---|
| 586 | const RecJetFormat* jet = trip.at(k);
|
|---|
| 587 | matched = (jet->momentum()).DeltaR(gen.momentum()) < 0.3;
|
|---|
| 588 | if (matched) matched_jets1.push_back(jet);
|
|---|
| 589 | }
|
|---|
| 590 | }
|
|---|
| 591 | else if (1<=gen.pdgid()&&gen.pdgid()<=4&&((gen.mothers()).at(0)==p_gluinos.at(1))) {
|
|---|
| 592 | for (unsigned int k = 0; k < trip.size(); k++) {
|
|---|
| 593 | const RecJetFormat* jet = trip.at(k);
|
|---|
| 594 | matched = (jet->momentum()).DeltaR(gen.momentum()) < 0.3;
|
|---|
| 595 | if (matched) matched_jets2.push_back(jet);
|
|---|
| 596 | }
|
|---|
| 597 | }
|
|---|
| 598 | else if (-4<=gen.pdgid()&&gen.pdgid()<=-1&&(gen.mothers()).at(0)==p_gluinos.at(0)) {
|
|---|
| 599 | for (unsigned int k = 0; k < trip.size(); k++) {
|
|---|
| 600 | const RecJetFormat* jet = trip.at(k);
|
|---|
| 601 | matched = (jet->momentum()).DeltaR(gen.momentum()) < 0.3;
|
|---|
| 602 | if (matched) matched_jets3.push_back(jet);
|
|---|
| 603 | }
|
|---|
| 604 | }
|
|---|
| 605 | else if (-4<=gen.pdgid()&&gen.pdgid()<=-1&&(gen.mothers()).at(0)==p_gluinos.at(1)) {
|
|---|
| 606 | for (unsigned int k = 0; k < trip.size(); k++) {
|
|---|
| 607 | const RecJetFormat* jet = trip.at(k);
|
|---|
| 608 | matched = (jet->momentum()).DeltaR(gen.momentum()) < 0.3;
|
|---|
| 609 | if (matched) matched_jets4.push_back(jet);
|
|---|
| 610 | }
|
|---|
| 611 | }
|
|---|
| 612 |
|
|---|
| 613 | }
|
|---|
| 614 |
|
|---|
| 615 | // remove double matching
|
|---|
| 616 | JetCollection::iterator last1, last2, last3, last4;
|
|---|
| 617 | sort(matched_jets1.begin(), matched_jets1.end());
|
|---|
| 618 | last1 = unique(matched_jets1.begin(), matched_jets1.end());
|
|---|
| 619 | matched_jets1.erase(last1, matched_jets1.end());
|
|---|
| 620 |
|
|---|
| 621 | sort(matched_jets2.begin(), matched_jets2.end());
|
|---|
| 622 | last2 = unique(matched_jets2.begin(), matched_jets2.end());
|
|---|
| 623 | matched_jets2.erase(last2, matched_jets2.end());
|
|---|
| 624 |
|
|---|
| 625 | sort(matched_jets3.begin(), matched_jets3.end());
|
|---|
| 626 | last3 = unique(matched_jets3.begin(), matched_jets3.end());
|
|---|
| 627 | matched_jets3.erase(last3, matched_jets3.end());
|
|---|
| 628 |
|
|---|
| 629 | sort(matched_jets4.begin(), matched_jets4.end());
|
|---|
| 630 | last4 = unique(matched_jets4.begin(), matched_jets4.end());
|
|---|
| 631 | matched_jets4.erase(last4, matched_jets4.end());
|
|---|
| 632 |
|
|---|
| 633 | if (matched_jets1.size() == 3) matched_trips.push_back({matched_jets1.at(0), matched_jets1.at(1), matched_jets1.at(2)});
|
|---|
| 634 | if (matched_jets2.size() == 3) matched_trips.push_back({matched_jets2.at(0), matched_jets2.at(1), matched_jets2.at(2)});
|
|---|
| 635 | if (matched_jets3.size() == 3) matched_trips.push_back({matched_jets3.at(0), matched_jets3.at(1), matched_jets3.at(2)});
|
|---|
| 636 | if (matched_jets4.size() == 3) matched_trips.push_back({matched_jets4.at(0), matched_jets4.at(1), matched_jets4.at(2)});
|
|---|
| 637 |
|
|---|
| 638 | // prepare for next iteration
|
|---|
| 639 | matched_jets1.clear();
|
|---|
| 640 | matched_jets2.clear();
|
|---|
| 641 | matched_jets3.clear();
|
|---|
| 642 | matched_jets4.clear();
|
|---|
| 643 | }
|
|---|
| 644 | return matched_trips;
|
|---|
| 645 | }
|
|---|
| 646 |
|
|---|