rivet is hosted by Hepforge, IPPP Durham
ATLAS_2014_I1282441.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/UnstableFinalState.hh"
00005 #include "Rivet/Projections/IdentifiedFinalState.hh"
00006 
00007 namespace Rivet {
00008 
00009 
00010   class ATLAS_2014_I1282441 : public Analysis {
00011   public:
00012 
00013     ATLAS_2014_I1282441()
00014       : Analysis("ATLAS_2014_I1282441")
00015     { }
00016 
00017 
00018     void init() {
00019 
00020       // Use a large eta range such that we can discriminate on y
00021       /// @todo Convert to use a y-cut directly
00022       UnstableFinalState ufs(Cuts::abseta < 10 && Cuts::pT > 500*MeV);
00023       IdentifiedFinalState phis(ufs);
00024       phis.acceptIdPair(PID::PHI);
00025       addProjection(phis, "Phis");
00026 
00027       IdentifiedFinalState kpms(Cuts::abseta < 2.0 && Cuts::pT > 230*MeV);
00028       kpms.acceptIdPair(PID::KPLUS);
00029       addProjection(kpms, "Kpms");
00030 
00031       _h_phi_rapidity = bookHisto1D(1,1,1);
00032       _h_phi_pT       = bookHisto1D(2,1,1);
00033     }
00034 
00035 
00036     void analyze(const Event& event) {
00037       const Particles& ks_all = applyProjection<IdentifiedFinalState>(event, "Kpms").particles();
00038       Particles kp, km;
00039       foreach (const Particle& p, ks_all) {
00040         if (!p.hasAncestor(PID::PHI)) { MSG_DEBUG("-- K not from phi."); continue; }
00041         if (p.p3().mod() > 800*MeV) { MSG_DEBUG("-- p K too high."); continue; }
00042         (p.charge() > 0 ? kp : km).push_back(p);
00043       }
00044 
00045       const Particles& phis_all = applyProjection<FinalState>(event, "Phis").particles();
00046       Particles phis;
00047       /// @todo Use particles(Cuts&) instead
00048       foreach (const Particle& p, phis_all) {
00049         if ( p.absrap() > 0.8 ) { MSG_DEBUG("-- phi Y too high."); continue; }
00050         if ( p.pT() > 1.2*GeV ) { MSG_DEBUG("-- phi pT too high."); continue; }
00051         phis.push_back(p);
00052       }
00053 
00054       // Find Phi -> KK decays through matching of the kinematics
00055       if (!kp.empty() && !km.empty() && !phis.empty()) {
00056         const double w = event.weight();
00057         MSG_DEBUG("Numbers of particles:  #phi=" << phis.size() << ", #K+=" << kp.size() << ", #K-=" << km.size());
00058         for (size_t ip = 0; ip < phis.size(); ++ip) {
00059           const Particle& phi = phis[ip];
00060           for (size_t ikm = 0; ikm < km.size(); ++ikm) {
00061             for (size_t ikp = 0; ikp < kp.size(); ++ikp) {
00062               const FourMomentum mom = kp[ikp].mom() + km[ikm].mom();
00063               if ( fuzzyEquals(mom.mass(), phi.mass(), 1e-5) ) {
00064                 MSG_DEBUG("Accepted combinatoric: phi#:" << ip << " K+#:" << ikp << " K-#:" << ikm);
00065                 _h_phi_rapidity->fill(phi.absrap(), w);
00066                 _h_phi_pT->fill(phi.pT()/MeV, w);
00067               } else {
00068                 MSG_DEBUG("Rejected combinatoric: phi#:" << ip << " K+#:" << ikp << " K-#:" << ikm << " Mass difference is " << mom.mass()-phi.mass());
00069               }
00070             }
00071           }
00072         }
00073       }
00074 
00075     }
00076 
00077 
00078     void finalize() {
00079       scale(_h_phi_rapidity, crossSection()/microbarn/sumOfWeights());
00080       scale(_h_phi_pT, crossSection()/microbarn/sumOfWeights());
00081     }
00082 
00083 
00084   private:
00085 
00086     Histo1DPtr _h_phi_rapidity, _h_phi_pT;
00087 
00088   };
00089 
00090 
00091 
00092   DECLARE_RIVET_PLUGIN(ATLAS_2014_I1282441);
00093 
00094 }