Rivet  1.8.0
Jet.hh
00001 // -*- C++ -*-
00002 #ifndef RIVET_Jet_HH
00003 #define RIVET_Jet_HH
00004 
00005 #include "Rivet/Rivet.hh"
00006 #include <numeric>
00007 
00008 namespace Rivet {
00009 
00010 
00012   class Jet : public ParticleBase {
00013   public:
00014 
00016 
00017 
00018     Jet() : ParticleBase() { clear(); }
00019 
00021     Jet(const vector<Particle>& particles, const FourMomentum& pjet)
00022       : ParticleBase() {
00023       setState(particles, pjet);
00024     }
00025 
00026     // /// Set all the jet data, without particle ID information.
00027     // Jet(const vector<FourMomentum>& momenta, const FourMomentum& pjet)
00028     //   : ParticleBase() {
00029     //   setState(momenta, pjet);
00030     // }
00031 
00033 
00034 
00036 
00037 
00039     size_t size() const { return _particles.size(); }
00040 
00041     // /// Define a Jet::iterator via a typedef.
00042     // typedef vector<FourMomentum>::iterator iterator;
00043 
00044     // /// Define a Jet::const_iterator via a typedef.
00045     // typedef vector<FourMomentum>::const_iterator const_iterator;
00046 
00047     // /// Get a begin iterator over the particle/track four-momenta in this jet.
00048     // iterator begin() {
00049     //   return _momenta.begin();
00050     // }
00051 
00052     // /// Get an end iterator over the particle/track four-momenta in this jet.
00053     // iterator end() {
00054     //   return _momenta.end();
00055     // }
00056 
00057     // /// Get a const begin iterator over the particle/track four-momenta in this jet.
00058     // const_iterator begin() const {
00059     //   return _momenta.begin();
00060     // }
00061 
00062     // /// Get a const end iterator over the particle/track four-momenta in this jet.
00063     // const_iterator end() const {
00064     //   return _momenta.end();
00065     // }
00066 
00067     // /// Get the track momenta in this jet.
00068     // vector<FourMomentum>& momenta() {
00069     //   return _momenta;
00070     // }
00071 
00072     // /// Get the track momenta in this jet (const version).
00073     // const vector<FourMomentum>& momenta() const {
00074     //   return _momenta;
00075     // }
00076 
00078     vector<Particle>& particles() { return _particles; }
00079 
00081     const vector<Particle>& particles() const { return _particles; }
00082 
00084     bool containsParticle(const Particle& particle) const;
00085 
00087     bool containsParticleId(PdgId pid) const;
00088 
00090     bool containsParticleId(const vector<PdgId>& pids) const;
00091 
00093     bool containsCharm() const;
00094 
00096     bool containsBottom() const;
00097 
00099 
00100 
00102 
00103 
00105     const FourMomentum& momentum() const { return _momentum; }
00106 
00108     double eta() const { return momentum().eta(); }
00109 
00111     double phi() const { return momentum().phi(); }
00112 
00114     double totalEnergy() const { return momentum().E(); }
00115 
00117     double neutralEnergy() const;
00118 
00120     double hadronicEnergy() const;
00121 
00123     double ptSum() const { return momentum().pT(); }
00124 
00126     double EtSum() const { return momentum().Et(); }
00127 
00129 
00130 
00132 
00133 
00135     Jet& setState(const vector<Particle>& particles, const FourMomentum& pjet);
00136 
00137     // /// Set all the jet data, without particle ID information.
00138     // Jet& setState(const vector<FourMomentum>& momenta, const FourMomentum& pjet);
00139 
00141     Jet& setMomentum(const FourMomentum& momentum);
00142 
00144     Jet& setParticles(const vector<Particle>& particles);
00145 
00146     // /// Set the particles collection with momentum information only.
00147     // Jet& setParticles(const vector<FourMomentum>& momenta);
00148 
00149     // /// Add a particle/track to this jet.
00150     // Jet& addParticle(const FourMomentum& particle);
00151 
00152     // /// Add a particle/track to this jet.
00153     // Jet& addParticle(const Particle& particle);
00154 
00156     Jet& clear();
00157 
00159 
00160 
00161   private:
00162 
00164     ParticleVector _particles;
00165 
00166     // /// The particle momenta.
00167     // /// @todo Eliminate this to ensure consistency.
00168     // std::vector<FourMomentum> _momenta;
00169 
00171     FourMomentum _momentum;
00172 
00173   };
00174 
00175 
00177   typedef std::vector<Jet> Jets;
00178 
00179 
00181 
00182 
00185   inline bool cmpJetsByPt(const Jet& a, const Jet& b) {
00186     return a.ptSum() > b.ptSum();
00187   }
00190   inline bool cmpJetsByAscPt(const Jet& a, const Jet& b) {
00191     return a.ptSum() < b.ptSum();
00192   }
00193 
00195   inline bool cmpJetsByP(const Jet& a, const Jet& b) {
00196     return a.momentum().vector3().mod() > b.momentum().vector3().mod();
00197   }
00199   inline bool cmpJetsByAscP(const Jet& a, const Jet& b) {
00200     return a.momentum().vector3().mod() < b.momentum().vector3().mod();
00201   }
00202 
00203   // @brief Compare jets by \f$ E_\perp \f$ (descending - usual sorting for HEP)
00205   inline bool cmpJetsByEt(const Jet& a, const Jet& b) {
00206     return a.EtSum() > b.EtSum();
00207   }
00208   // @brief Compare jets by \f$ E_\perp \f$ (ascending)
00210   inline bool cmpJetsByEtDesc(const Jet& a, const Jet& b) {
00211     return a.EtSum() < b.EtSum();
00212   }
00213 
00216   inline bool cmpJetsByE(const Jet& a, const Jet& b) {
00217     return a.momentum().E() > b.momentum().E();
00218   }
00221   inline bool cmpJetsByAscE(const Jet& a, const Jet& b) {
00222     return a.momentum().E() < b.momentum().E();
00223   }
00224 
00227   inline bool cmpJetsByDescPseudorapidity(const Jet& a, const Jet& b) {
00228     return a.momentum().pseudorapidity() > b.momentum().pseudorapidity();
00229   }
00232   inline bool cmpJetsByAscPseudorapidity(const Jet& a, const Jet& b) {
00233     return a.momentum().pseudorapidity() < b.momentum().pseudorapidity();
00234   }
00235 
00238   inline bool cmpJetsByDescAbsPseudorapidity(const Jet& a, const Jet& b) {
00239     return fabs(a.momentum().pseudorapidity()) > fabs(b.momentum().pseudorapidity());
00240   }
00243   inline bool cmpJetsByAscAbsPseudorapidity(const Jet& a, const Jet& b) {
00244     return fabs(a.momentum().pseudorapidity()) < fabs(b.momentum().pseudorapidity());
00245   }
00246 
00249   inline bool cmpJetsByDescRapidity(const Jet& a, const Jet& b) {
00250     return a.momentum().rapidity() > b.momentum().rapidity();
00251   }
00254   inline bool cmpJetsByAscRapidity(const Jet& a, const Jet& b) {
00255     return a.momentum().rapidity() < b.momentum().rapidity();
00256   }
00257 
00260   inline bool cmpJetsByDescAbsRapidity(const Jet& a, const Jet& b) {
00261     return fabs(a.momentum().rapidity()) > fabs(b.momentum().rapidity());
00262   }
00265   inline bool cmpJetsByAscAbsRapidity(const Jet& a, const Jet& b) {
00266     return fabs(a.momentum().rapidity()) < fabs(b.momentum().rapidity());
00267   }
00268 
00270 
00271   inline double deltaR(const Jet& j1, const Jet& j2,
00272                        RapScheme scheme = PSEUDORAPIDITY) {
00273     return deltaR(j1.momentum(), j2.momentum(), scheme);
00274   }
00275 
00276   inline double deltaR(const Jet& j, const Particle& p,
00277                        RapScheme scheme = PSEUDORAPIDITY) {
00278     return deltaR(j.momentum(), p.momentum(), scheme);
00279   }
00280 
00281   inline double deltaR(const Particle& p, const Jet& j,
00282                        RapScheme scheme = PSEUDORAPIDITY) {
00283     return deltaR(p.momentum(), j.momentum(), scheme);
00284   }
00285 
00286   inline double deltaR(const Jet& j, const FourMomentum& v,
00287                        RapScheme scheme = PSEUDORAPIDITY) {
00288     return deltaR(j.momentum(), v, scheme);
00289   }
00290 
00291   inline double deltaR(const Jet& j, const FourVector& v,
00292                        RapScheme scheme = PSEUDORAPIDITY) {
00293     return deltaR(j.momentum(), v, scheme);
00294   }
00295 
00296   inline double deltaR(const Jet& j, const Vector3& v) {
00297     return deltaR(j.momentum(), v);
00298   }
00299 
00300   inline double deltaR(const Jet& j, double eta, double phi) {
00301     return deltaR(j.momentum(), eta, phi);
00302   }
00303 
00304   inline double deltaR(const FourMomentum& v, const Jet& j,
00305                        RapScheme scheme = PSEUDORAPIDITY) {
00306     return deltaR(v, j.momentum(), scheme);
00307   }
00308 
00309   inline double deltaR(const FourVector& v, const Jet& j,
00310                        RapScheme scheme = PSEUDORAPIDITY) {
00311     return deltaR(v, j.momentum(), scheme);
00312   }
00313 
00314   inline double deltaR(const Vector3& v, const Jet& j) {
00315     return deltaR(v, j.momentum());
00316   }
00317 
00318   inline double deltaR(double eta, double phi, const Jet& j) {
00319     return deltaR(eta, phi, j.momentum());
00320   }
00321 
00322 
00323   inline double deltaPhi(const Jet& j1, const Jet& j2) {
00324     return deltaPhi(j1.momentum(), j2.momentum());
00325   }
00326 
00327   inline double deltaPhi(const Jet& j, const Particle& p) {
00328     return deltaPhi(j.momentum(), p.momentum());
00329   }
00330 
00331   inline double deltaPhi(const Particle& p, const Jet& j) {
00332     return deltaPhi(p.momentum(), j.momentum());
00333   }
00334 
00335   inline double deltaPhi(const Jet& j, const FourMomentum& v) {
00336     return deltaPhi(j.momentum(), v);
00337   }
00338 
00339   inline double deltaPhi(const Jet& j, const FourVector& v) {
00340     return deltaPhi(j.momentum(), v);
00341   }
00342 
00343   inline double deltaPhi(const Jet& j, const Vector3& v) {
00344     return deltaPhi(j.momentum(), v);
00345   }
00346 
00347   inline double deltaPhi(const Jet& j, double phi) {
00348     return deltaPhi(j.momentum(), phi);
00349   }
00350 
00351   inline double deltaPhi(const FourMomentum& v, const Jet& j) {
00352     return deltaPhi(v, j.momentum());
00353   }
00354 
00355   inline double deltaPhi(const FourVector& v, const Jet& j) {
00356     return deltaPhi(v, j.momentum());
00357   }
00358 
00359   inline double deltaPhi(const Vector3& v, const Jet& j) {
00360     return deltaPhi(v, j.momentum());
00361   }
00362 
00363   inline double deltaPhi(double phi, const Jet& j) {
00364     return deltaPhi(phi, j.momentum());
00365   }
00366 
00367 
00368   inline double deltaEta(const Jet& j1, const Jet& j2) {
00369     return deltaEta(j1.momentum(), j2.momentum());
00370   }
00371 
00372   inline double deltaEta(const Jet& j, const Particle& p) {
00373     return deltaEta(j.momentum(), p.momentum());
00374   }
00375 
00376   inline double deltaEta(const Particle& p, const Jet& j) {
00377     return deltaEta(p.momentum(), j.momentum());
00378   }
00379 
00380   inline double deltaEta(const Jet& j, const FourMomentum& v) {
00381     return deltaEta(j.momentum(), v);
00382   }
00383 
00384   inline double deltaEta(const Jet& j, const FourVector& v) {
00385     return deltaEta(j.momentum(), v);
00386   }
00387 
00388   inline double deltaEta(const Jet& j, const Vector3& v) {
00389     return deltaEta(j.momentum(), v);
00390   }
00391 
00392   inline double deltaEta(const Jet& j, double eta) {
00393     return deltaEta(j.momentum(), eta);
00394   }
00395 
00396   inline double deltaEta(const FourMomentum& v, const Jet& j) {
00397     return deltaEta(v, j.momentum());
00398   }
00399 
00400   inline double deltaEta(const FourVector& v, const Jet& j) {
00401     return deltaEta(v, j.momentum());
00402   }
00403 
00404   inline double deltaEta(const Vector3& v, const Jet& j) {
00405     return deltaEta(v, j.momentum());
00406   }
00407 
00408   inline double deltaEta(double eta, const Jet& j) {
00409     return deltaEta(eta, j.momentum());
00410   }
00411 
00412 }
00413 
00414 #endif