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 } Generated on Tue Mar 24 2015 17:35:23 for The Rivet MC analysis system by ![]() |