JetAlg.hh

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #ifndef RIVET_JetAlg_HH
00003 #define RIVET_JetAlg_HH
00004 
00005 #include "Rivet/Projection.hh"
00006 #include "Rivet/Projections/FinalState.hh"
00007 #include "Rivet/Projections/VisibleFinalState.hh"
00008 #include "Rivet/Particle.hh"
00009 #include "Rivet/Jet.hh"
00010 
00011 namespace Rivet {
00012 
00013 
00014   inline bool cmpMomByPt(const FourMomentum& a, const FourMomentum& b) {
00015     return a.pT() > b.pT();
00016   }
00017   inline bool cmpMomByAscPt(const FourMomentum& a, const FourMomentum& b) {
00018     return a.pT() < b.pT();
00019   }
00020   inline bool cmpMomByEt(const FourMomentum& a, const FourMomentum& b) {
00021     return a.Et() > b.Et();
00022   }
00023   inline bool cmpMomByAscEt(const FourMomentum& a, const FourMomentum& b) {
00024     return a.Et() < b.Et();
00025   }
00026   inline bool cmpMomByE(const FourMomentum& a, const FourMomentum& b) {
00027     return a.E() > b.E();
00028   }
00029   inline bool cmpMomByAscE(const FourMomentum& a, const FourMomentum& b) {
00030     return a.E() < b.E();
00031   }
00032   inline bool cmpMomByDescPseudorapidity(const FourMomentum& a, const FourMomentum& b) {
00033     return a.pseudorapidity() > b.pseudorapidity();
00034   }
00035   inline bool cmpMomByAscPseudorapidity(const FourMomentum& a, const FourMomentum& b) {
00036     return a.pseudorapidity() < b.pseudorapidity();
00037   }
00038   inline bool cmpMomByDescAbsPseudorapidity(const FourMomentum& a, const FourMomentum& b) {
00039     return fabs(a.pseudorapidity()) > fabs(b.pseudorapidity());
00040   }
00041   inline bool cmpMomByAscAbsPseudorapidity(const FourMomentum& a, const FourMomentum& b) {
00042     return fabs(a.pseudorapidity()) < fabs(b.pseudorapidity());
00043   }
00044   inline bool cmpMomByDescRapidity(const FourMomentum& a, const FourMomentum& b) {
00045     return a.rapidity() > b.rapidity();
00046   }
00047   inline bool cmpMomByAscRapidity(const FourMomentum& a, const FourMomentum& b) {
00048     return a.rapidity() < b.rapidity();
00049   }
00050   inline bool cmpMomByDescAbsRapidity(const FourMomentum& a, const FourMomentum& b) {
00051     return fabs(a.rapidity()) > fabs(b.rapidity());
00052   }
00053   inline bool cmpMomByAscAbsRapidity(const FourMomentum& a, const FourMomentum& b) {
00054     return fabs(a.rapidity()) < fabs(b.rapidity());
00055   }
00056 
00057 
00058   /// Abstract base class for projections which can return a set of {@link Jet}s.
00059   class JetAlg : public Projection {
00060   public:
00061 
00062     /// Constructor
00063     JetAlg(const FinalState& fs);
00064 
00065     /// Clone on the heap.
00066     virtual const Projection* clone() const = 0;
00067 
00068     /// Destructor
00069     virtual ~JetAlg() { }
00070 
00071     /// @brief Include invisible particles in jet construction.
00072     /// The default behaviour is that jets are only constructed from visible
00073     /// (i.e. charged under an SM gauge group) particles. Some jet studies,
00074     /// including those from ATLAS, use a definition in which neutrinos from hadron
00075     /// decays are included (via MC correction) in the experimental jet definition.
00076     /// Setting this flag to true avoids the automatic restriction to a VisibleFinalState.
00077     void useInvisibles(bool useinvis=true) {
00078       _useInvisibles = useinvis;
00079     }
00080 
00081     /// Get jets in no guaranteed order, with optional cuts on \f$ p_\perp \f$ and rapidity.
00082     /// @todo Introduce MomentumFilter objects for pT, ET, eta, y, etc. filtering, to avoid double-arg ambiguities
00083     virtual Jets jets(double ptmin=0.0, double ptmax=MAXDOUBLE,
00084                       double rapmin=-MAXDOUBLE, double rapmax=MAXDOUBLE,
00085                       RapScheme rapscheme=PSEUDORAPIDITY) const {
00086       const Jets rawjets = _jets(ptmin);
00087       Jets rtn;
00088       MSG_DEBUG("Raw jet size (with pTmin cut) = " << rawjets.size());
00089       foreach (const Jet& j, rawjets) {
00090         const FourMomentum pj = j.momentum();
00091         if (!inRange(pj.pT(), ptmin, ptmax)) continue;
00092         if (rapscheme == PSEUDORAPIDITY && !inRange(pj.eta(), rapmin, rapmax)) continue;
00093         if (rapscheme == RAPIDITY && !inRange(pj.rapidity(), rapmin, rapmax)) continue;
00094         rtn += j;
00095       }
00096       return rtn;
00097     }
00098 
00099     /// Get the jets, ordered by supplied sorting function object, with optional cuts on \f$ p_\perp \f$ and rapidity.
00100     /// @todo Introduce MomentumFilter objects for pT, ET, eta, y, etc. filtering, to avoid double-arg ambiguities
00101     template <typename F>
00102     Jets jets(F sorter, double ptmin=0.0, double ptmax=MAXDOUBLE,
00103               double rapmin=-MAXDOUBLE, double rapmax=MAXDOUBLE,
00104               RapScheme rapscheme=PSEUDORAPIDITY) const {
00105       Jets js = jets(ptmin);
00106       if (sorter != 0) {
00107         std::sort(js.begin(), js.end(), sorter);
00108       }
00109       return js;
00110     }
00111 
00112     /// Get the jets, ordered by \f$ p_T \f$, with optional cuts on \f$ p_\perp \f$ and rapidity.
00113     /// @todo Introduce MomentumFilter objects for pT, ET, eta, y, etc. filtering, to avoid double-arg ambiguities
00114     Jets jetsByPt(double ptmin=0.0, double ptmax=MAXDOUBLE,
00115                   double rapmin=-MAXDOUBLE, double rapmax=MAXDOUBLE,
00116                   RapScheme rapscheme=PSEUDORAPIDITY) const {
00117       return jets(cmpJetsByPt, ptmin, ptmax, rapmin, rapmax, rapscheme);
00118     }
00119 
00120     /// Get the jets, ordered by \f$ E \f$, with optional cuts on \f$ p_\perp \f$ and rapidity.
00121     /// @todo Introduce MomentumFilter objects for pT, ET, eta, y, etc. filtering, to avoid double-arg ambiguities
00122     Jets jetsByE(double ptmin=0.0, double ptmax=MAXDOUBLE,
00123                  double rapmin=-MAXDOUBLE, double rapmax=MAXDOUBLE,
00124                  RapScheme rapscheme=PSEUDORAPIDITY) const {
00125       return jets(cmpJetsByE, ptmin, ptmax, rapmin, rapmax, rapscheme);
00126     }
00127 
00128     /// Get the jets, ordered by \f$ E_T \f$, with optional cuts on \f$ p_\perp \f$ and rapidity.
00129     /// @todo Introduce MomentumFilter objects for pT, ET, eta, y, etc. filtering, to avoid double-arg ambiguities
00130     Jets jetsByEt(double ptmin=0.0, double ptmax=MAXDOUBLE,
00131                   double rapmin=-MAXDOUBLE, double rapmax=MAXDOUBLE,
00132                   RapScheme rapscheme=PSEUDORAPIDITY) const {
00133       return jets(cmpJetsByEt, ptmin, ptmax, rapmin, rapmax, rapscheme);
00134     }
00135 
00136 
00137   protected:
00138 
00139     /// @brief Internal pure virtual method for getting jets in no guaranteed order.
00140     /// An optional cut on min \f$ p_\perp \f$ is applied in this function, since that is
00141     /// directly supported by FastJet and it seems a shame to not make use of that. But
00142     /// all other jet cuts are applied at the @c ::jets() function level.
00143     virtual Jets _jets(double ptmin=0.0) const = 0;
00144 
00145 
00146   public:
00147 
00148     /// Number of jets.
00149     virtual size_t size() const = 0;
00150 
00151     /// Clear the projection
00152     virtual void reset() = 0;
00153 
00154     typedef Jet entity_type;
00155     typedef Jets collection_type;
00156 
00157     /// Template-usable interface common to FinalState.
00158     collection_type entities() const { return jets(); }
00159 
00160     /// Do the calculation locally (no caching).
00161     virtual void calc(const ParticleVector& ps) = 0;
00162 
00163 
00164   protected:
00165 
00166     /// Perform the projection on the Event.
00167     virtual void project(const Event& e) = 0;
00168 
00169     /// Compare projections.
00170     virtual int compare(const Projection& p) const = 0;
00171 
00172 
00173   protected:
00174 
00175     /// Flag to determine whether or not the VFS wrapper is to be used.
00176     bool _useInvisibles;
00177 
00178   };
00179 
00180 
00181 }
00182 
00183 #endif