rivet is hosted by Hepforge, IPPP Durham
OPAL_1996_S3257789.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analysis.hh"
00003 #include "Rivet/RivetYODA.hh"
00004 #include "Rivet/Tools/ParticleIdUtils.hh"
00005 #include "Rivet/Projections/Beam.hh"
00006 #include "Rivet/Projections/FinalState.hh"
00007 #include "Rivet/Projections/ChargedFinalState.hh"
00008 #include "Rivet/Projections/UnstableFinalState.hh"
00009 
00010 namespace Rivet {
00011 
00012 
00013   /// @brief OPAL J/Psi fragmentation function paper
00014   /// @author Peter Richardson
00015   class OPAL_1996_S3257789 : public Analysis {
00016   public:
00017 
00018     /// Constructor
00019     OPAL_1996_S3257789()
00020       : Analysis("OPAL_1996_S3257789"), _weightSum(0.)
00021     {}
00022 
00023 
00024     /// @name Analysis methods
00025     //@{
00026 
00027     void init() {
00028       addProjection(Beam(), "Beams");
00029       addProjection(ChargedFinalState(), "FS");
00030       addProjection(UnstableFinalState(), "UFS");
00031       _histXpJPsi   = bookHisto1D( 1, 1, 1);
00032       _multJPsi     = bookHisto1D( 2, 1, 1);
00033       _multPsiPrime = bookHisto1D( 2, 1, 2);
00034     }
00035 
00036 
00037     void analyze(const Event& e) {
00038       // First, veto on leptonic events by requiring at least 4 charged FS particles
00039       const FinalState& fs = applyProjection<FinalState>(e, "FS");
00040       const size_t numParticles = fs.particles().size();
00041 
00042       // Even if we only generate hadronic events, we still need a cut on numCharged >= 2.
00043       if (numParticles < 2) {
00044         MSG_DEBUG("Failed leptonic event cut");
00045         vetoEvent;
00046       }
00047       MSG_DEBUG("Passed leptonic event cut");
00048 
00049       // Get event weight for histo filling
00050       const double weight = e.weight();
00051 
00052       // Get beams and average beam momentum
00053       const ParticlePair& beams = applyProjection<Beam>(e, "Beams").beams();
00054       const double meanBeamMom = ( beams.first.momentum().vector3().mod() +
00055                                    beams.second.momentum().vector3().mod() ) / 2.0;
00056       MSG_DEBUG("Avg beam momentum = " << meanBeamMom);
00057 
00058       // Final state of unstable particles to get particle spectra
00059       const UnstableFinalState& ufs = applyProjection<UnstableFinalState>(e, "UFS");
00060 
00061       foreach (const Particle& p, ufs.particles()) {
00062         if(abs(p.pdgId())==443) {
00063           double xp = p.momentum().vector3().mod()/meanBeamMom;
00064           _histXpJPsi->fill(xp, weight);
00065           _multJPsi->fill(91.2,weight);
00066           _weightSum += weight;
00067         }
00068         else if(abs(p.pdgId())==100443) {
00069           _multPsiPrime->fill(91.2,weight);
00070         }
00071       }
00072     }
00073 
00074 
00075     /// Finalize
00076     void finalize() {
00077       if(_weightSum>0.)
00078         scale(_histXpJPsi  , 0.1/_weightSum);
00079       scale(_multJPsi    , 1./sumOfWeights());
00080       scale(_multPsiPrime, 1./sumOfWeights());
00081     }
00082 
00083     //@}
00084 
00085 
00086   private:
00087 
00088     double _weightSum;
00089     Histo1DPtr _histXpJPsi;
00090     Histo1DPtr _multJPsi;
00091     Histo1DPtr _multPsiPrime;
00092     //@}
00093 
00094   };
00095 
00096   // The hook for the plugin system
00097   DECLARE_RIVET_PLUGIN(OPAL_1996_S3257789);
00098 
00099 }