rivet is hosted by Hepforge, IPPP Durham
ATLAS_2011_S9212183.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/FastJets.hh"
00009 
00010 namespace Rivet {
00011 
00012 
00013   /// @author Chris Wymant
00014   class ATLAS_2011_S9212183 : public Analysis {
00015   public:
00016 
00017     /// @name Constructors etc.
00018     //@{
00019 
00020     /// Constructor
00021     ATLAS_2011_S9212183()
00022       : Analysis("ATLAS_2011_S9212183")
00023     {    }
00024 
00025     //@}
00026 
00027 
00028   public:
00029 
00030     /// @name Analysis methods
00031     //@{
00032 
00033     /// Book histograms and initialise projections before the run
00034     void init() {
00035 
00036       // Projection to find the electrons
00037       IdentifiedFinalState elecs( EtaIn(-2.47, 2.47) 
00038                   & (Cuts::pT >= 20.0*GeV) );
00039       elecs.acceptIdPair(PID::ELECTRON);
00040       addProjection(elecs, "elecs");
00041 
00042       // Projection to find the muons
00043       IdentifiedFinalState muons( EtaIn(-2.4, 2.4) 
00044                   & (Cuts::pT >= 10.0*GeV) );
00045       muons.acceptIdPair(PID::MUON);
00046       addProjection(muons, "muons");
00047 
00048       // Jet finder
00049       addProjection(FastJets(FinalState(), FastJets::ANTIKT, 0.4), "AntiKtJets04");
00050 
00051       // All tracks (to do deltaR with leptons)
00052       addProjection(ChargedFinalState(-3.0,3.0),"cfs");
00053 
00054       // Used for pTmiss (N.B. the real 'vfs' extends beyond 4.5 to |eta| = 4.9)
00055       addProjection(VisibleFinalState(-4.5,4.5),"vfs");
00056 
00057 
00058       // Book histograms
00059       _count_2j   = bookHisto1D("count_2j",   1, 0., 1.);
00060       _count_3j   = bookHisto1D("count_3j",   1, 0., 1.);
00061       _count_4j5  = bookHisto1D("count_4j5",  1, 0., 1.);
00062       _count_4j10 = bookHisto1D("count_4j10", 1, 0., 1.);
00063       _count_HM   = bookHisto1D("count_HM",   1, 0., 1.);
00064 
00065       _hist_meff_2j  = bookHisto1D(1, 1, 1);
00066       _hist_meff_3j  = bookHisto1D(2, 1, 1);
00067       _hist_meff_4j  = bookHisto1D(3, 1, 1);
00068       _hist_meff_HM  = bookHisto1D(4, 1, 1);
00069 
00070       _hist_eTmiss  = bookHisto1D("Et_miss", 20, 0., 1000.);
00071     }
00072 
00073 
00074     /// Perform the per-event analysis
00075     void analyze(const Event& event) {
00076       const double weight = event.weight();
00077 
00078       Jets cand_jets;
00079       const Jets jets = applyProjection<FastJets>(event, "AntiKtJets04").jetsByPt(20.0*GeV);
00080       foreach (const Jet& jet, jets) {
00081         if ( fabs( jet.eta() ) < 4.9 ) {
00082           cand_jets.push_back(jet);
00083         }
00084       }
00085 
00086       const Particles cand_e  = applyProjection<IdentifiedFinalState>(event, "elecs").particlesByPt();
00087 
00088       // Muon isolation not mentioned in hep-exp 1109.6572, unlike in 1102.5290,
00089       // but assumed to still be applicable
00090       Particles cand_mu;
00091       const Particles chg_tracks = applyProjection<ChargedFinalState>(event, "cfs").particles();
00092       const Particles muons = applyProjection<IdentifiedFinalState>(event, "muons").particlesByPt();
00093       foreach (const Particle& mu, muons) {
00094         double pTinCone = -mu.pT();
00095         foreach (const Particle& track, chg_tracks) {
00096           if ( deltaR(mu.momentum(),track.momentum()) <= 0.2 ) {
00097             pTinCone += track.pT();
00098           }
00099         }
00100         if ( pTinCone < 1.8*GeV ) cand_mu.push_back(mu);
00101       }
00102 
00103       // Resolve jet-lepton overlap for jets with |eta| < 2.8
00104       Jets cand_jets_2;
00105       foreach ( const Jet& jet, cand_jets ) {
00106         if ( fabs( jet.eta() ) >= 2.8 ) {
00107           cand_jets_2.push_back( jet );
00108         } else {
00109           bool away_from_e = true;
00110           foreach ( const Particle & e, cand_e ) {
00111             if ( deltaR(e.momentum(),jet.momentum()) <= 0.2 ) {
00112               away_from_e = false;
00113               break;
00114             }
00115           }
00116           if ( away_from_e ) cand_jets_2.push_back( jet );
00117         }
00118       }
00119 
00120 
00121       Particles recon_e, recon_mu;
00122 
00123       foreach ( const Particle & e, cand_e ) {
00124         bool away = true;
00125         foreach ( const Jet& jet, cand_jets_2 ) {
00126           if ( deltaR(e.momentum(),jet.momentum()) < 0.4 ) {
00127             away = false;
00128             break;
00129           }
00130         }
00131         if ( away ) recon_e.push_back( e );
00132       }
00133 
00134       foreach ( const Particle & mu, cand_mu ) {
00135         bool away = true;
00136         foreach ( const Jet& jet, cand_jets_2 ) {
00137           if ( deltaR(mu.momentum(),jet.momentum()) < 0.4 ) {
00138             away = false;
00139             break;
00140           }
00141         }
00142         if ( away ) recon_mu.push_back( mu );
00143       }
00144 
00145 
00146       // pTmiss
00147       // Based on all candidate electrons, muons and jets, plus everything else with |eta| < 4.5
00148       // i.e. everything in our projection "vfs" plus the jets with |eta| > 4.5
00149       Particles vfs_particles = applyProjection<VisibleFinalState>(event, "vfs").particles();
00150       FourMomentum pTmiss;
00151       foreach ( const Particle & p, vfs_particles ) {
00152         pTmiss -= p.momentum();
00153       }
00154       foreach ( const Jet& jet, cand_jets_2 ) {
00155         if ( fabs( jet.eta() ) > 4.5 ) pTmiss -= jet.momentum();
00156       }
00157       double eTmiss = pTmiss.pT();
00158 
00159 
00160       // Final jet filter
00161       Jets recon_jets;
00162       foreach ( const Jet& jet, cand_jets_2 ) {
00163         if ( fabs( jet.eta() ) <= 2.8 ) recon_jets.push_back( jet );
00164       }
00165       // NB. It seems that jets with |eta| > 2.8 could have been thrown away at
00166       // the start; we don't do so, in order to follow both the structure of
00167       // the paper and the similar Rivet analysis ATLAS_2011_S8983313
00168 
00169       // 'candidate' muons needed only 10 GeV, to cause a veto they need 20 GeV
00170       Particles veto_mu;
00171       foreach ( const Particle & mu, cand_mu ) {
00172         if ( mu.pT() >= 20.0*GeV ) veto_mu.push_back(mu);
00173       }
00174 
00175       if ( ! ( veto_mu.empty() && recon_e.empty() ) ) {
00176         MSG_DEBUG("Charged leptons left after selection");
00177         vetoEvent;
00178       }
00179 
00180       if ( eTmiss <= 130 * GeV ) {
00181         MSG_DEBUG("Not enough eTmiss: " << eTmiss << " < 130");
00182         vetoEvent;
00183       }
00184 
00185       if ( recon_jets.empty() || recon_jets[0].pT() <= 130.0 * GeV ) {
00186         MSG_DEBUG("No hard leading jet in " << recon_jets.size() << " jets");
00187         vetoEvent;
00188       }
00189 
00190       // ==================== observables ====================
00191 
00192       int Njets = 0;
00193       double min_dPhi = 999.999;
00194       double pTmiss_phi = pTmiss.phi();
00195       foreach ( const Jet& jet, recon_jets ) {
00196         if ( jet.pT() > 40 * GeV ) {
00197           if ( Njets < 3 ) {
00198             min_dPhi = min( min_dPhi, deltaPhi( pTmiss_phi, jet.momentum().phi() ) );
00199           }
00200           ++Njets;
00201         }
00202       }
00203 
00204       int NjetsHighMass = 0;
00205       foreach ( const Jet& jet, recon_jets ) {
00206         if ( jet.pT() > 80.0 * GeV ) {
00207           ++NjetsHighMass;
00208         }
00209       }
00210 
00211       if ( Njets < 2 ) {
00212         MSG_DEBUG("Only " << Njets << " >40 GeV jets left");
00213         vetoEvent;
00214       }
00215 
00216       if ( min_dPhi <= 0.4 ) {
00217         MSG_DEBUG("dPhi too small");
00218         vetoEvent;
00219       }
00220 
00221       // m_eff
00222       double m_eff_2j = eTmiss + recon_jets[0].pT() + recon_jets[1].pT();
00223       double m_eff_3j = recon_jets.size() < 3 ? -999.0 : m_eff_2j + recon_jets[2].pT();
00224       double m_eff_4j = recon_jets.size() < 4 ? -999.0 : m_eff_3j + recon_jets[3].pT();
00225       double m_eff_HM = eTmiss;
00226       foreach ( const Jet& jet, recon_jets ) {
00227         if ( jet.pT() > 40.0 * GeV ) m_eff_HM += jet.pT();
00228       }
00229 
00230       double et_meff_2j = eTmiss / m_eff_2j;
00231       double et_meff_3j = eTmiss / m_eff_3j;
00232       double et_meff_4j = eTmiss / m_eff_4j;
00233       double et_meff_HM = eTmiss / m_eff_HM;
00234 
00235 
00236       // ==================== FILL ====================
00237 
00238       MSG_DEBUG( "Trying to fill "
00239                  << Njets << ' '
00240                  << m_eff_2j << ' '
00241                  << et_meff_2j << ' '
00242                  << m_eff_3j << ' '
00243                  << et_meff_3j << ' '
00244                  << m_eff_4j << ' '
00245                  << et_meff_4j << ' '
00246                  << m_eff_HM << ' '
00247                  << et_meff_HM );
00248 
00249 
00250       _hist_eTmiss->fill(eTmiss, weight);
00251 
00252 
00253       // 2j region
00254       if ( et_meff_2j > 0.3 ) {
00255         _hist_meff_2j->fill(m_eff_2j, weight);
00256         if ( m_eff_2j > 1000 * GeV ) {
00257           MSG_DEBUG("Hits 2j");
00258           _count_2j->fill(0.5, weight);
00259         }
00260       }
00261 
00262 
00263       // 3j region
00264       if ( Njets >= 3 && et_meff_3j > 0.25 ) {
00265         _hist_meff_3j->fill(m_eff_3j, weight);
00266         if ( m_eff_3j > 1000 * GeV ) {
00267           MSG_DEBUG("Hits 3j");
00268           _count_3j->fill(0.5, weight);
00269         }
00270       }
00271 
00272 
00273       // 4j5 & 4j10 regions
00274       if ( Njets >= 4 && et_meff_4j > 0.25 ) {
00275         _hist_meff_4j->fill(m_eff_4j, weight);
00276         if ( m_eff_4j > 500 * GeV ) {
00277           MSG_DEBUG("Hits 4j5");
00278           _count_4j5->fill(0.5, weight);
00279         }
00280         if ( m_eff_4j > 1000 * GeV ) {
00281           MSG_DEBUG("Hits 4j10");
00282           _count_4j10->fill(0.5, weight);
00283         }
00284       }
00285 
00286 
00287       // High mass region
00288       if ( NjetsHighMass >= 4 && et_meff_HM > 0.2 ) {
00289         _hist_meff_HM->fill(m_eff_HM, weight);
00290         if ( m_eff_HM > 1100 * GeV ) {
00291           MSG_DEBUG("Hits HM");
00292           _count_HM->fill(0.5, weight);
00293         }
00294       }
00295 
00296     }
00297 
00298 
00299     void finalize() {
00300       // Two, three and four jet channels have bin width = 100 (GeV)
00301       // High mass channel has bin width = 150 (GeV)
00302       // Integrated luminosity = 1040 (pb)
00303       scale( _hist_meff_2j, 100. * 1040 * crossSection()/sumOfWeights() );
00304       scale( _hist_meff_3j, 100. * 1040 * crossSection()/sumOfWeights() );
00305       scale( _hist_meff_4j, 100. * 1040 * crossSection()/sumOfWeights() );
00306       scale( _hist_meff_HM, 150. * 1040 * crossSection()/sumOfWeights() );
00307     }
00308 
00309     //@}
00310 
00311 
00312   private:
00313 
00314     Histo1DPtr _count_2j;
00315     Histo1DPtr _count_3j;
00316     Histo1DPtr _count_4j5;
00317     Histo1DPtr _count_4j10;
00318     Histo1DPtr _count_HM;
00319     Histo1DPtr _hist_meff_2j;
00320     Histo1DPtr _hist_meff_3j;
00321     Histo1DPtr _hist_meff_4j;
00322     Histo1DPtr _hist_meff_HM;
00323     Histo1DPtr _hist_eTmiss;
00324 
00325   };
00326 
00327 
00328   // This global object acts as a hook for the plugin system
00329   DECLARE_RIVET_PLUGIN(ATLAS_2011_S9212183);
00330 
00331 }