00001
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
00059 class JetAlg : public Projection {
00060 public:
00061
00062
00063 JetAlg(const FinalState& fs);
00064
00065
00066 virtual const Projection* clone() const = 0;
00067
00068
00069 virtual ~JetAlg() { }
00070
00071
00072
00073
00074
00075
00076
00077 void useInvisibles(bool useinvis=true) {
00078 _useInvisibles = useinvis;
00079 }
00080
00081
00082
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
00100
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
00113
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
00121
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
00129
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
00140
00141
00142
00143 virtual Jets _jets(double ptmin=0.0) const = 0;
00144
00145
00146 public:
00147
00148
00149 virtual size_t size() const = 0;
00150
00151
00152 virtual void reset() = 0;
00153
00154 typedef Jet entity_type;
00155 typedef Jets collection_type;
00156
00157
00158 collection_type entities() const { return jets(); }
00159
00160
00161 virtual void calc(const ParticleVector& ps) = 0;
00162
00163
00164 protected:
00165
00166
00167 virtual void project(const Event& e) = 0;
00168
00169
00170 virtual int compare(const Projection& p) const = 0;
00171
00172
00173 protected:
00174
00175
00176 bool _useInvisibles;
00177
00178 };
00179
00180
00181 }
00182
00183 #endif