ATLAS_2013_I1190187.cc
Go to the documentation of this file.
00001 // -*- C++ -*- 00002 #include "Rivet/Analysis.hh" 00003 #include "Rivet/Projections/FinalState.hh" 00004 #include "Rivet/Projections/IdentifiedFinalState.hh" 00005 #include "Rivet/Projections/VetoedFinalState.hh" 00006 #include "Rivet/Projections/FastJets.hh" 00007 #include "Rivet/Projections/DressedLeptons.hh" 00008 #include "Rivet/Projections/MissingMomentum.hh" 00009 00010 namespace Rivet { 00011 00012 using namespace Cuts; 00013 00014 00015 /// ATLAS Wee Wemu Wmumu analysis at Z TeV 00016 class ATLAS_2013_I1190187 : public Analysis { 00017 public: 00018 00019 /// Default constructor 00020 ATLAS_2013_I1190187() 00021 : Analysis("ATLAS_2013_I1190187") 00022 { } 00023 00024 00025 void init() { 00026 FinalState fs; 00027 00028 Cut etaRanges_EL 00029 = ( etaIn(-2.47, -1.52) 00030 | etaIn(-1.37, 1.37) 00031 | etaIn( 1.52, 2.47) ) & (pT >= 20.0*GeV); 00032 00033 Cut etaRanges_MU = etaIn(-2.4,2.4) & (pT >= 20.0*GeV); 00034 00035 MissingMomentum met(fs); 00036 addProjection(met, "MET"); 00037 00038 IdentifiedFinalState Photon(fs); 00039 Photon.acceptIdPair(PID::PHOTON); 00040 00041 IdentifiedFinalState bare_EL(fs); 00042 bare_EL.acceptIdPair(PID::ELECTRON); 00043 00044 IdentifiedFinalState bare_MU(fs); 00045 bare_MU.acceptIdPair(PID::MUON); 00046 00047 IdentifiedFinalState neutrinoFS(fs); 00048 neutrinoFS.acceptNeutrinos(); 00049 addProjection(neutrinoFS, "Neutrinos"); 00050 00051 //////////////////////////////////////////////////////// 00052 // DRESSED LEPTONS 00053 // 3.arg: 0.1 = dR(lep,phot) 00054 // 4.arg: true = do clustering 00055 // 7.arg: false = ignore photons from hadron or tau 00056 // 00057 ////////////////////////////////////////////////////////// 00058 DressedLeptons electronFS(Photon, bare_EL, 0.1, true, etaRanges_EL, false); 00059 addProjection(electronFS, "ELECTRON_FS"); 00060 00061 DressedLeptons muonFS(Photon, bare_MU, 0.1, true, etaRanges_MU, false); 00062 addProjection(muonFS, "MUON_FS"); 00063 00064 VetoedFinalState jetinput; 00065 jetinput.addVetoOnThisFinalState(bare_MU); 00066 jetinput.addVetoOnThisFinalState(neutrinoFS); 00067 00068 FastJets jetpro(jetinput, FastJets::ANTIKT, 0.4); 00069 addProjection(jetpro, "jet"); 00070 00071 // Book histograms 00072 _h_Wl1_pT_mumu = bookHisto1D(1, 1, 2); 00073 _h_Wl1_pT_ee = bookHisto1D(1, 1, 1); 00074 _h_Wl1_pT_emu = bookHisto1D(1, 1, 3); 00075 _h_Wl1_pT_inclusive = bookHisto1D(4, 1, 1); 00076 } 00077 00078 00079 /// Do the analysis 00080 void analyze(const Event& e) { 00081 00082 const vector<DressedLepton>& muonFS = applyProjection<DressedLeptons>(e, "MUON_FS").clusteredLeptons(); 00083 const vector<DressedLepton>& electronFS = applyProjection<DressedLeptons>(e, "ELECTRON_FS").clusteredLeptons(); 00084 const MissingMomentum& met = applyProjection<MissingMomentum>(e, "MET"); 00085 00086 vector<DressedLepton> dressed_lepton, isolated_lepton, fiducial_lepton; 00087 dressed_lepton.insert(dressed_lepton.end(), muonFS.begin(), muonFS.end()); 00088 dressed_lepton.insert(dressed_lepton.end(), electronFS.begin(), electronFS.end()); 00089 00090 //////////////////////////////////////////////////////////////////////////// 00091 // OVERLAP REMOVAL 00092 // -electrons with dR(e,mu)<0.1 are removed 00093 // -lower pT electrons with dR(e,e)<0.1 are removed 00094 // 00095 //////////////////////////////////////////////////////////////////////////// 00096 foreach (DressedLepton& l1, dressed_lepton) { 00097 bool l_isolated = true; 00098 foreach (DressedLepton& l2, dressed_lepton) { 00099 if (l1 != l2 && l2.constituentLepton().abspid() == PID::ELECTRON) { 00100 double overlapControl_ll= deltaR(l1.constituentLepton(),l2.constituentLepton()); 00101 if (overlapControl_ll < 0.1) { 00102 l_isolated = false; 00103 // e/e overlap removal 00104 if (l1.constituentLepton().abspid() == PID::ELECTRON) { 00105 if (l1.constituentLepton().pT()>l2.constituentLepton().pT()) { 00106 isolated_lepton.push_back(l1);//keep e with highest pT 00107 } else { 00108 isolated_lepton.push_back(l2);//keep e with highest pT 00109 } 00110 } 00111 // e/mu overlap removal 00112 if (l1.constituentLepton().abspid() == PID::MUON) isolated_lepton.push_back(l1); //keep mu 00113 } 00114 } 00115 } 00116 if (l_isolated) isolated_lepton.push_back(l1); 00117 } 00118 00119 00120 /////////////////////////////////////////////////////////////////////////////////////////////////////////// 00121 // PRESELECTION: 00122 // "isolated_lepton:" 00123 // * electron: pt>20 GeV, |eta|<1.37, 1.52<|eta|<2.47, dR(electron,muon)>0.1 00124 // * muon: pt>20 GeV, |eta|<2.4 00125 // * dR(l,l)>0.1 00126 // 00127 // "fiducial_lepton"= isolated_lepton with 00128 // * 2 leptons (e or mu) 00129 // * leading lepton pt (pT_l1) >25 GeV 00130 // * opposite charged leptons 00131 // 00132 /////////////////////////////////////////////////////////////////////////////////////////////////////////// 00133 if (isolated_lepton.size() != 2) vetoEvent; 00134 sort(isolated_lepton.begin(), isolated_lepton.end(), cmpMomByPt); 00135 if (isolated_lepton[0].pT() > 25*GeV && threeCharge(isolated_lepton[0]) != threeCharge(isolated_lepton[1])) { 00136 fiducial_lepton.insert(fiducial_lepton.end(), isolated_lepton.begin(), isolated_lepton.end()); 00137 } 00138 if (fiducial_lepton.size() == 0) vetoEvent; 00139 double pT_l1 = fiducial_lepton[0].pT(); 00140 double M_l1l2 = (fiducial_lepton[0].momentum() + fiducial_lepton[1].momentum()).mass(); 00141 double pT_l1l2 = (fiducial_lepton[0].momentum() + fiducial_lepton[1].momentum()).pT(); 00142 00143 00144 ///////////////////////////////////////////////////////////////////////// 00145 // JETS 00146 // -"alljets": found by "jetpro" projection && pT()>25 GeV && |y|<4.5 00147 // -"vetojets": "alljets" && dR(electron,jet)>0.3 00148 // 00149 ///////////////////////////////////////////////////////////////////////// 00150 Jets alljets, vetojets; 00151 foreach (const Jet& j, applyProjection<FastJets>(e, "jet").jetsByPt(25)) { 00152 if (j.absrap() > 4.5 ) continue; 00153 alljets.push_back(j); 00154 bool deltaRcontrol = true; 00155 foreach (DressedLepton& fl,fiducial_lepton) { 00156 if (fl.constituentLepton().abspid() == PID::ELECTRON) { //electrons 00157 double deltaRjets = deltaR(fl.constituentLepton().momentum(), j.momentum(), RAPIDITY); 00158 if (deltaRjets <= 0.3) deltaRcontrol = false; //false if at least one electron is in the overlap region 00159 } 00160 } 00161 if (deltaRcontrol) vetojets.push_back(j); 00162 } 00163 00164 00165 ///////////////////////////////////////////////////////////////////////////////////////////////// 00166 // MISSING ETrel 00167 // -"mismom": fourvector of invisible momentum found by "met" projection 00168 // -"delta_phi": delta phi between mismom and the nearest "fiducial_lepton" or "vetojet" 00169 // -"MET_rel": missing transverse energy defined as: 00170 // *"mismom" for "delta_phi" >= (0.5*pi) 00171 // *"mismom.pT()*sin(delta_phi)" for "delta_phi" < (0.5*pi) 00172 // 00173 ///////////////////////////////////////////////////////////////////////////////////////////////// 00174 FourMomentum mismom; 00175 double MET_rel = 0, delta_phi = 0; 00176 mismom = -met.visibleMomentum(); 00177 vector<double> vL_MET_angle, vJet_MET_angle; 00178 vL_MET_angle.push_back(fabs(deltaPhi(fiducial_lepton[0].momentum(), mismom))); 00179 vL_MET_angle.push_back(fabs(deltaPhi(fiducial_lepton[1].momentum(), mismom))); 00180 foreach (double& lM, vL_MET_angle) if (lM > M_PI) lM = 2*M_PI - lM; 00181 00182 std::sort(vL_MET_angle.begin(), vL_MET_angle.end()); 00183 if (vetojets.size() == 0) delta_phi = vL_MET_angle[0]; 00184 if (vetojets.size() > 0) { 00185 foreach (Jet& vj, vetojets) { 00186 double jet_MET_angle = fabs(deltaPhi(vj.momentum(), mismom)); 00187 if (jet_MET_angle > M_PI) jet_MET_angle = 2*M_PI - jet_MET_angle; 00188 vJet_MET_angle.push_back(jet_MET_angle); 00189 } 00190 std::sort(vJet_MET_angle.begin(), vJet_MET_angle.end()); 00191 if (vL_MET_angle[0] <= vJet_MET_angle[0]) delta_phi = vL_MET_angle[0]; 00192 if (vL_MET_angle[0] > vJet_MET_angle[0]) delta_phi = vJet_MET_angle[0]; 00193 } 00194 00195 if (delta_phi >= (0.5*M_PI)) delta_phi = 0.5*M_PI; 00196 MET_rel = mismom.pT()*sin(delta_phi); 00197 00198 00199 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00200 // CUTS 00201 // -jetveto: event with at least one vetojet is vetoed 00202 // -M_Z: Z mass M_Z=91.1876*GeV 00203 // 00204 // * ee channel: MET_rel > 45 GeV, M_l1l2 > 15 GeV, |M_l1l2-M_Z| > 15 GeV, jetveto, pT_l1l2 > 30 GeV 00205 // * mumu channel: MET_rel > 45 GeV, M_l1l2 > 15 GeV, |M_l1l2-M_Z| > 15 GeV, jetveto, pT_l1l2 > 30 GeV 00206 // * emu channel: MET_rel > 25 GeV, M_l1l2 > 10 GeV, |M_l1l2-M_Z| > 0 GeV, jetveto, pT_l1l2 > 30 GeV 00207 // 00208 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 00209 00210 // Get event weight for histo filling 00211 const double weight = e.weight(); 00212 00213 // ee channel 00214 if (fiducial_lepton[0].abspid() == PID::ELECTRON && fiducial_lepton[1].abspid() == PID::ELECTRON) { 00215 if (MET_rel <= 45*GeV) vetoEvent; 00216 if (M_l1l2 <= 15*GeV) vetoEvent; 00217 if (fabs(M_l1l2 - 91.1876*GeV) <= 15*GeV) vetoEvent; 00218 if (vetojets.size() != 0) vetoEvent; 00219 if (pT_l1l2 <= 30*GeV) vetoEvent; 00220 _h_Wl1_pT_ee->fill(sqrtS()*GeV, weight); 00221 _h_Wl1_pT_inclusive->fill(pT_l1, weight); 00222 } 00223 00224 // mumu channel 00225 else if (fiducial_lepton[0].abspid() == PID::MUON && fiducial_lepton[1].abspid() == PID::MUON) { 00226 if (MET_rel <= 45*GeV) vetoEvent; 00227 if (M_l1l2 <= 15*GeV) vetoEvent; 00228 if (fabs(M_l1l2-91.1876*GeV) <= 15*GeV) vetoEvent; 00229 if (vetojets.size() != 0) vetoEvent; 00230 if (pT_l1l2 <= 30*GeV) vetoEvent; 00231 _h_Wl1_pT_mumu->fill(sqrtS()*GeV, weight); 00232 _h_Wl1_pT_inclusive->fill(pT_l1, weight); 00233 } 00234 00235 // emu channel 00236 else if (fiducial_lepton[0].abspid() != fiducial_lepton[1].abspid()) { 00237 if (MET_rel <= 25*GeV) vetoEvent; 00238 if (M_l1l2 <= 10*GeV) vetoEvent; 00239 if (vetojets.size() != 0) vetoEvent; 00240 if (pT_l1l2 <= 30*GeV) vetoEvent; 00241 _h_Wl1_pT_emu->fill(sqrtS()*GeV, weight); 00242 _h_Wl1_pT_inclusive->fill(pT_l1, weight); 00243 } 00244 } 00245 00246 00247 /// Finalize 00248 void finalize() { 00249 const double norm = crossSection()/sumOfWeights()/femtobarn; 00250 scale(_h_Wl1_pT_ee, norm); 00251 scale(_h_Wl1_pT_mumu, norm); 00252 scale(_h_Wl1_pT_emu, norm); 00253 normalize(_h_Wl1_pT_inclusive, 1); 00254 } 00255 00256 00257 private: 00258 00259 Histo1DPtr _h_Wl1_pT_ee, _h_Wl1_pT_mumu, _h_Wl1_pT_emu, _h_Wl1_pT_inclusive; 00260 00261 }; 00262 00263 00264 // The hook for the plugin system 00265 DECLARE_RIVET_PLUGIN(ATLAS_2013_I1190187); 00266 00267 } Generated on Tue Sep 30 2014 19:45:42 for The Rivet MC analysis system by ![]() |