rivet is hosted by Hepforge, IPPP Durham
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 }