rivet is hosted by Hepforge, IPPP Durham
ATLAS_2011_CONF_2011_090.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analysis.hh"
00003 #include "Rivet/Tools/BinnedHistogram.hh"
00004 #include "Rivet/Projections/FinalState.hh"
00005 #include "Rivet/Projections/ChargedFinalState.hh"
00006 #include "Rivet/Projections/VisibleFinalState.hh"
00007 #include "Rivet/Projections/IdentifiedFinalState.hh"
00008 #include "Rivet/Projections/VetoedFinalState.hh"
00009 #include "Rivet/Projections/FastJets.hh"
00010 
00011 namespace Rivet {
00012 
00013 
00014   class ATLAS_2011_CONF_2011_090 : public Analysis {
00015   public:
00016 
00017     /// @name Constructors etc.
00018     //@{
00019 
00020     /// Constructor
00021 
00022     ATLAS_2011_CONF_2011_090()
00023       : Analysis("ATLAS_2011_CONF_2011_090")
00024     {    }
00025 
00026     //@}
00027 
00028 
00029   public:
00030 
00031     /// @name Analysis methods
00032     //@{
00033 
00034     /// Book histograms and initialize projections before the run
00035     void init() {
00036 
00037       // projection to find the electrons
00038       IdentifiedFinalState elecs(Cuts::abseta < 2.47 && Cuts::pT >= 20*GeV);
00039       elecs.acceptIdPair(PID::ELECTRON);
00040       addProjection(elecs, "elecs");
00041 
00042       // veto region electrons (from 2010 arXiv:1102.2357v2)
00043       Cut vetocut = Cuts::absetaIn(1.37, 1.52);
00044       IdentifiedFinalState veto_elecs(vetocut && Cuts::pT > 10*GeV);
00045       veto_elecs.acceptIdPair(PID::ELECTRON);
00046       addProjection(veto_elecs, "veto_elecs");
00047 
00048       // projection to find the muons
00049       IdentifiedFinalState muons(Cuts::abseta < 2.4 && Cuts::pT > 10*GeV);
00050       muons.acceptIdPair(PID::MUON);
00051       addProjection(muons, "muons");
00052 
00053       // Jet finder
00054       VetoedFinalState vfs;
00055       vfs.addVetoPairId(PID::MUON);
00056       addProjection(FastJets(vfs, FastJets::ANTIKT, 0.4), "AntiKtJets04");
00057 
00058       // all tracks (to do deltaR with leptons)
00059       addProjection(ChargedFinalState(Cuts::abseta < 3.0 && Cuts::pT > 0.5*GeV), "cfs");
00060 
00061       // for pTmiss
00062       addProjection(VisibleFinalState(Cuts::abseta < 4.9), "vfs");
00063 
00064       /// Book histograms
00065       _count_mu_channel = bookHisto1D("count_muon_channel", 1, 0., 1.);
00066       _count_e_channel = bookHisto1D("count_electron_channel", 1, 0., 1.);
00067       _hist_eTmiss_e = bookHisto1D("Et_miss_e", 50, 0., 500.);
00068       _hist_eTmiss_mu = bookHisto1D("Et_miss_mu", 50, 0., 500.);
00069       _hist_m_eff_e = bookHisto1D("m_eff_e", 60, 0., 1500.);
00070       _hist_m_eff_mu = bookHisto1D("m_eff_mu", 60, 0., 1500.);
00071       _hist_m_eff_e_final = bookHisto1D("m_eff_e_final", 15, 0., 1500.);
00072       _hist_m_eff_mu_final = bookHisto1D("m_eff_mu_final", 15, 0., 1500.);
00073     }
00074 
00075 
00076 
00077     /// Perform the per-event analysis
00078     void analyze(const Event& event) {
00079 
00080       const double weight = event.weight();
00081 
00082       Particles veto_e = applyProjection<IdentifiedFinalState>(event, "veto_elecs").particles();
00083       if ( ! veto_e.empty() ) {
00084         MSG_DEBUG("electrons in veto region");
00085         vetoEvent;
00086       }
00087 
00088       Jets cand_jets = applyProjection<FastJets>(event, "AntiKtJets04").jetsByPt(Cuts::pT > 20*GeV && Cuts::abseta < 2.8);
00089 
00090       Particles candtemp_e = applyProjection<IdentifiedFinalState>(event, "elecs").particlesByPt();
00091       Particles candtemp_mu = applyProjection<IdentifiedFinalState>(event,"muons").particlesByPt();
00092       Particles chg_tracks = applyProjection<ChargedFinalState>(event, "cfs").particles();
00093       Particles cand_mu;
00094       Particles cand_e;
00095 
00096       // pTcone around muon track
00097       foreach ( const Particle& mu, candtemp_mu ) {
00098         double pTinCone = -mu.pT();
00099         foreach ( const Particle& track, chg_tracks ) {
00100           if ( deltaR(mu, track) < 0.2 )
00101             pTinCone += track.pT();
00102         }
00103         if ( pTinCone < 1.8*GeV )
00104           cand_mu.push_back(mu);
00105       }
00106 
00107 
00108       // pTcone around electron
00109       foreach ( const Particle& e, candtemp_e ) {
00110         double pTinCone = -e.pT();
00111         foreach ( const Particle& track, chg_tracks ) {
00112           if ( deltaR(e, track) < 0.2 )
00113             pTinCone += track.pT();
00114         }
00115         if ( pTinCone < 0.10 * e.pT() )
00116           cand_e.push_back(e);
00117       }
00118 
00119 
00120       // discard jets that overlap with electrons
00121       Jets cand_jets_2;
00122       foreach ( const Jet& jet, cand_jets ) {
00123         bool away_from_e = true;
00124         foreach ( const Particle & e, cand_e ) {
00125           if ( deltaR(e, jet) <= 0.2 ) {
00126             away_from_e = false;
00127             break;
00128           }
00129         }
00130         if ( away_from_e )
00131           cand_jets_2.push_back( jet );
00132       }
00133 
00134       // only consider leptons far from jet
00135       Particles recon_e, recon_mu;
00136       foreach ( const Particle & e, cand_e ) {
00137         bool e_near_jet = false;
00138         foreach ( const Jet& jet, cand_jets_2 ) {
00139           if (inRange(deltaR(e, jet), 0.2, 0.4)) e_near_jet = true;
00140         }
00141         if ( ! e_near_jet ) recon_e.push_back( e );
00142       }
00143 
00144       foreach ( const Particle & mu, cand_mu ) {
00145         bool mu_near_jet = false;
00146         foreach ( const Jet& jet, cand_jets_2 ) {
00147           if ( deltaR(mu, jet) < 0.4 ) mu_near_jet = true;
00148         }
00149         if ( ! mu_near_jet ) recon_mu.push_back( mu );
00150       }
00151 
00152       // pTmiss
00153       Particles vfs_particles
00154         = applyProjection<VisibleFinalState>(event, "vfs").particles();
00155       FourMomentum pTmiss;
00156       foreach ( const Particle & p, vfs_particles ) {
00157         pTmiss -= p.momentum();
00158       }
00159       double eTmiss = pTmiss.pT();
00160 
00161 
00162       // final jet filter
00163       Jets recon_jets;
00164       foreach ( const Jet& jet, cand_jets_2 ) {
00165         recon_jets.push_back( jet );
00166       }
00167 
00168 
00169 
00170 
00171       // ==================== observables ====================
00172 
00173 
00174       // Njets
00175 
00176       int Njets = 0;
00177       double pTmiss_phi = pTmiss.phi();
00178       foreach ( const Jet& jet, recon_jets ) {
00179         if ( jet.abseta() < 2.8 )
00180           Njets+=1;
00181       }
00182       if ( Njets < 3 ) {
00183         MSG_DEBUG("Only " << Njets << " jets w/ eta<2.8 left");
00184         vetoEvent;
00185       }
00186 
00187       if ( recon_jets[0].pT() <= 60.0 * GeV ) {
00188         MSG_DEBUG("No hard leading jet in " << recon_jets.size() << " jets");
00189         vetoEvent;
00190       }
00191       for ( int i = 1; i < 3; ++i ) {
00192         if ( recon_jets[i].pT() <= 25*GeV ) {
00193           vetoEvent;
00194         }
00195       }
00196 
00197       for ( int i = 0; i < 3; ++i ) {
00198         double dPhi = deltaPhi( pTmiss_phi, recon_jets[i].phi() );
00199         if ( dPhi <= 0.2 ) {
00200           MSG_DEBUG("dPhi too small");
00201           vetoEvent;
00202           break;
00203         }
00204       }
00205 
00206 
00207       Particles lepton;
00208       if ( recon_mu.empty() && recon_e.empty() ) {
00209         MSG_DEBUG("No leptons");
00210         vetoEvent;
00211       }
00212       else {
00213         foreach ( const Particle & mu, recon_mu )
00214           lepton.push_back(mu);
00215         foreach ( const Particle & e, recon_e )
00216           lepton.push_back(e);
00217       }
00218 
00219       std::sort(lepton.begin(), lepton.end(), cmpMomByPt);
00220 
00221       double e_id = 11;
00222       double mu_id = 13;
00223 
00224       // one hard leading lepton cut
00225       if ( lepton[0].abspid() == e_id &&
00226            lepton[0].pT() <= 25*GeV ) {
00227         vetoEvent;
00228       }
00229       else if ( lepton[0].abspid() == mu_id &&
00230                 lepton[0].pT() <= 20*GeV ) {
00231         vetoEvent;
00232       }
00233 
00234       // exactly one hard leading lepton cut
00235       if(lepton.size()>1) {
00236         if ( lepton[1].abspid() == e_id &&
00237              lepton[1].pT() > 20*GeV ) {
00238           vetoEvent;
00239         }
00240         else if ( lepton[1].abspid() == mu_id &&
00241                   lepton[1].pT() > 10*GeV ) {
00242           vetoEvent;
00243         }
00244       }
00245 
00246 
00247       // ==================== FILL ====================
00248 
00249 
00250       FourMomentum pT_l = lepton[0].momentum();
00251 
00252 
00253       double dPhi = deltaPhi( pT_l.phi(), pTmiss_phi);
00254       double mT = sqrt( 2 * pT_l.pT() * eTmiss * (1 - cos(dPhi)) );
00255 
00256 
00257       // effective mass
00258       double m_eff = eTmiss + pT_l.pT()
00259         + recon_jets[0].pT()
00260         + recon_jets[1].pT()
00261         + recon_jets[2].pT();
00262 
00263 
00264       // Electron channel signal region
00265 
00266       if (  lepton[0].abspid() == e_id ) {
00267 
00268         _hist_eTmiss_e->fill(eTmiss, weight);
00269         _hist_m_eff_e->fill(m_eff, weight);
00270 
00271         if ( mT > 100*GeV && eTmiss > 125*GeV ) {
00272           _hist_m_eff_e_final->fill(m_eff, weight);
00273           if ( m_eff > 500*GeV && eTmiss > 0.25*m_eff ) {
00274             _count_e_channel->fill(0.5,weight);
00275           }
00276         }
00277       }
00278 
00279       // Muon channel signal region
00280 
00281       else if (  lepton[0].abspid() == mu_id ) {
00282 
00283         _hist_eTmiss_mu->fill(eTmiss, weight);
00284         _hist_m_eff_mu->fill(m_eff, weight);
00285 
00286         if ( mT > 100*GeV && eTmiss > 125*GeV ) {
00287           _hist_m_eff_mu_final->fill(m_eff, weight);
00288           if ( m_eff > 500*GeV && eTmiss > 0.25*m_eff ) {
00289             _count_mu_channel->fill(0.5,weight);
00290           }
00291         }
00292 
00293       }
00294 
00295 
00296     }
00297 
00298     //@}
00299 
00300 
00301     void finalize() {
00302       scale( _hist_eTmiss_e      , 10.  * 165. * crossSection()/picobarn/sumOfWeights() );
00303       scale( _hist_eTmiss_mu     , 10.  * 165. * crossSection()/picobarn/sumOfWeights() );
00304       scale( _hist_m_eff_e       , 25.  * 165. * crossSection()/picobarn/sumOfWeights() );
00305       scale( _hist_m_eff_mu      , 25.  * 165. * crossSection()/picobarn/sumOfWeights() );
00306       scale( _hist_m_eff_e_final , 100. * 165. * crossSection()/picobarn/sumOfWeights() );
00307       scale( _hist_m_eff_mu_final, 100. * 165. * crossSection()/picobarn/sumOfWeights() );
00308     }
00309 
00310   private:
00311 
00312     /// @name Histograms
00313     //@{
00314     Histo1DPtr _count_e_channel;
00315     Histo1DPtr _count_mu_channel;
00316 
00317     Histo1DPtr _hist_eTmiss_e;
00318     Histo1DPtr _hist_eTmiss_mu;
00319 
00320     Histo1DPtr _hist_m_eff_e;
00321     Histo1DPtr _hist_m_eff_mu;
00322     Histo1DPtr _hist_m_eff_e_final;
00323     Histo1DPtr _hist_m_eff_mu_final;
00324 
00325 
00326     //@}
00327 
00328 
00329   };
00330 
00331 
00332 
00333   // The hook for the plugin system
00334   DECLARE_RIVET_PLUGIN(ATLAS_2011_CONF_2011_090);
00335 
00336 }