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 } Generated on Thu Feb 6 2014 17:38:41 for The Rivet MC analysis system by ![]() |