rivet is hosted by Hepforge, IPPP Durham
ParticleBase.hh
Go to the documentation of this file.
00001 #ifndef RIVET_ParticleBase_HH
00002 #define RIVET_ParticleBase_HH
00003 
00004 #include "Rivet/Config/RivetCommon.hh"
00005 #include "Rivet/Jet.fhh"
00006 #include "Rivet/Tools/Cuts.fhh"
00007 #include "Rivet/Math/Vectors.hh"
00008 
00009 namespace Rivet {
00010 
00011 
00012   /// @brief Base class for particle-like things like Particle and Jet
00013   class ParticleBase {
00014   public:
00015 
00016     /// Default constructor
00017     ParticleBase() { }
00018 
00019     /// Virtual destructor
00020     virtual ~ParticleBase() { }
00021 
00022 
00023     /// @name Effective momentum accessors
00024     //@{
00025 
00026     /// Get equivalent single momentum four-vector (const).
00027     virtual const FourMomentum& momentum() const = 0;
00028     /// Get equivalent single momentum four-vector (const) (alias).
00029     const FourMomentum& mom() const { return momentum(); };
00030 
00031     /// Cast operator for conversion to FourMomentum
00032     operator const FourMomentum& () const { return momentum(); }
00033 
00034     //@}
00035 
00036 
00037     /// @name Convenience access to the effective 4-vector properties
00038     //@{
00039 
00040     /// Get the energy directly.
00041     double E() const { return momentum().E(); }
00042     /// Get the energy directly (alias).
00043     double energy() const { return momentum().E(); }
00044 
00045     /// Get the energy-squared.
00046     double E2() const { return momentum().E2(); }
00047     /// Get the energy-squared (alias).
00048     double energy2() const { return momentum().E2(); }
00049 
00050     /// Get the \f$ p_T \f$ directly.
00051     double pt() const { return momentum().pt(); }
00052     /// Get the \f$ p_T \f$ directly (alias).
00053     double pT() const { return pt(); }
00054     /// Get the \f$ p_T \f$ directly (alias).
00055     double perp() const { return pt(); }
00056 
00057     /// Get the \f$ p_T^2 \f$ directly.
00058     double pt2() const { return momentum().pt2(); }
00059     /// Get the \f$ p_T^2 \f$ directly (alias).
00060     double pT2() const { return pt2(); }
00061     /// Get the \f$ p_T^2 \f$ directly (alias).
00062     double perp2() const { return pt2(); }
00063 
00064     /// Get the \f$ E_T \f$ directly.
00065     double Et() const { return momentum().Et(); }
00066     /// Get the \f$ E_T^2 \f$ directly.
00067     double Et2() const { return momentum().Et2(); }
00068 
00069     /// Get the mass directly.
00070     double mass() const { return momentum().mass(); }
00071     /// Get the mass**2 directly.
00072     double mass2() const { return momentum().mass2(); }
00073 
00074     /// Get the \f$ \eta \f$ directly.
00075     double pseudorapidity() const { return momentum().eta(); }
00076     /// Get the \f$ \eta \f$ directly (alias).
00077     double eta() const { return momentum().eta(); }
00078     /// Get the \f$ |\eta| \f$ directly.
00079     double abspseudorapidity() const { return momentum().abspseudorapidity(); }
00080     /// Get the \f$ |\eta| \f$ directly (alias).
00081     double abseta() const { return momentum().abseta(); }
00082 
00083     /// Get the \f$ y \f$ directly.
00084     double rapidity() const { return momentum().rapidity(); }
00085     /// Get the \f$ y \f$ directly (alias).
00086     double rap() const { return momentum().rapidity(); }
00087     /// Get the \f$ |y| \f$ directly.
00088     double absrapidity() const { return momentum().absrapidity(); }
00089     /// Get the \f$ |y| \f$ directly (alias).
00090     double absrap() const { return momentum().absrap(); }
00091 
00092     /// Azimuthal angle \f$ \phi \f$.
00093     double azimuthalAngle(const PhiMapping mapping=ZERO_2PI) const { return momentum().azimuthalAngle(mapping); }
00094     /// Get the \f$ \phi \f$ directly.
00095     double phi(const PhiMapping mapping=ZERO_2PI) const { return momentum().phi(mapping); }
00096 
00097 
00098     /// Get the 3-momentum directly.
00099     Vector3 p3() const { return momentum().vector3(); }
00100     /// Get the 3-momentum magnitude directly.
00101     double p() const { return momentum().p(); }
00102     /// Get the 3-momentum magnitude-squared directly.
00103     double p2() const { return momentum().p2(); }
00104 
00105     /// x component of momentum.
00106     double px() const { return momentum().x(); }
00107     /// y component of momentum.
00108     double py() const { return momentum().y(); }
00109     /// z component of momentum.
00110     double pz() const { return momentum().z(); }
00111 
00112     /// x component of momentum, squared.
00113     double px2() const { return momentum().x2(); }
00114     /// y component of momentum, squared.
00115     double py2() const { return momentum().y2(); }
00116     /// z component of momentum, squared.
00117     double pz2() const { return momentum().z2(); }
00118 
00119     /// Angle subtended by the 3-vector and the z-axis.
00120     double polarAngle() const { return momentum().polarAngle(); }
00121     /// Synonym for polarAngle.
00122     double theta() const { return momentum().theta(); }
00123 
00124     /// Angle between this vector and another
00125     double angle(const ParticleBase& v) const { return momentum().angle(v.momentum()); }
00126     /// Angle between this vector and another
00127     double angle(const FourVector& v) const { return momentum().angle(v); }
00128     /// Angle between this vector and another (3-vector)
00129     double angle(const Vector3& v3) const { return momentum().angle(v3); }
00130 
00131     //@}
00132 
00133   };
00134 
00135 
00136   /// @name deltaR, deltaEta, deltaPhi functions specifically for Particle/Jet arguments
00137   //@{
00138 
00139   inline double deltaR(const ParticleBase& p1, const ParticleBase& p2,
00140                        RapScheme scheme = PSEUDORAPIDITY) {
00141     return deltaR(p1.momentum(), p2.momentum(), scheme);
00142   }
00143 
00144   inline double deltaR(const ParticleBase& p, const FourMomentum& v,
00145                        RapScheme scheme = PSEUDORAPIDITY) {
00146     return deltaR(p.momentum(), v, scheme);
00147   }
00148 
00149   inline double deltaR(const ParticleBase& p, const FourVector& v,
00150                        RapScheme scheme = PSEUDORAPIDITY) {
00151     return deltaR(p.momentum(), v, scheme);
00152   }
00153 
00154   inline double deltaR(const ParticleBase& p, const Vector3& v) {
00155     return deltaR(p.momentum(), v);
00156   }
00157 
00158   inline double deltaR(const ParticleBase& p, double eta, double phi) {
00159     return deltaR(p.momentum(), eta, phi);
00160   }
00161 
00162   inline double deltaR(const FourMomentum& v, const ParticleBase& p,
00163                        RapScheme scheme = PSEUDORAPIDITY) {
00164     return deltaR(v, p.momentum(), scheme);
00165   }
00166 
00167   inline double deltaR(const FourVector& v, const ParticleBase& p,
00168                        RapScheme scheme = PSEUDORAPIDITY) {
00169     return deltaR(v, p.momentum(), scheme);
00170   }
00171 
00172   inline double deltaR(const Vector3& v, const ParticleBase& p) {
00173     return deltaR(v, p.momentum());
00174   }
00175 
00176   inline double deltaR(double eta, double phi, const ParticleBase& p) {
00177     return deltaR(eta, phi, p.momentum());
00178   }
00179 
00180 
00181   inline double deltaPhi(const ParticleBase& p1, const ParticleBase& p2) {
00182     return deltaPhi(p1.momentum(), p2.momentum());
00183   }
00184 
00185   inline double deltaPhi(const ParticleBase& p, const FourMomentum& v) {
00186     return deltaPhi(p.momentum(), v);
00187   }
00188 
00189   inline double deltaPhi(const ParticleBase& p, const FourVector& v) {
00190     return deltaPhi(p.momentum(), v);
00191   }
00192 
00193   inline double deltaPhi(const ParticleBase& p, const Vector3& v) {
00194     return deltaPhi(p.momentum(), v);
00195   }
00196 
00197   inline double deltaPhi(const ParticleBase& p, double phi) {
00198     return deltaPhi(p.momentum(), phi);
00199   }
00200 
00201   inline double deltaPhi(const FourMomentum& v, const ParticleBase& p) {
00202     return deltaPhi(v, p.momentum());
00203   }
00204 
00205   inline double deltaPhi(const FourVector& v, const ParticleBase& p) {
00206     return deltaPhi(v, p.momentum());
00207   }
00208 
00209   inline double deltaPhi(const Vector3& v, const ParticleBase& p) {
00210     return deltaPhi(v, p.momentum());
00211   }
00212 
00213   inline double deltaPhi(double phi, const ParticleBase& p) {
00214     return deltaPhi(phi, p.momentum());
00215   }
00216 
00217 
00218   inline double deltaEta(const ParticleBase& p1, const ParticleBase& p2) {
00219     return deltaEta(p1.momentum(), p2.momentum());
00220   }
00221 
00222   inline double deltaEta(const ParticleBase& p, const FourMomentum& v) {
00223     return deltaEta(p.momentum(), v);
00224   }
00225 
00226   inline double deltaEta(const ParticleBase& p, const FourVector& v) {
00227     return deltaEta(p.momentum(), v);
00228   }
00229 
00230   inline double deltaEta(const ParticleBase& p, const Vector3& v) {
00231     return deltaEta(p.momentum(), v);
00232   }
00233 
00234   inline double deltaEta(const ParticleBase& p, double eta) {
00235     return deltaEta(p.momentum(), eta);
00236   }
00237 
00238   inline double deltaEta(const FourMomentum& v, const ParticleBase& p) {
00239     return deltaEta(v, p.momentum());
00240   }
00241 
00242   inline double deltaEta(const FourVector& v, const ParticleBase& p) {
00243     return deltaEta(v, p.momentum());
00244   }
00245 
00246   inline double deltaEta(const Vector3& v, const ParticleBase& p) {
00247     return deltaEta(v, p.momentum());
00248   }
00249 
00250   inline double deltaEta(double eta, const ParticleBase& p) {
00251     return deltaEta(eta, p.momentum());
00252   }
00253 
00254 
00255   inline double deltaRap(const ParticleBase& p1, const ParticleBase& p2) {
00256     return deltaRap(p1.momentum(), p2.momentum());
00257   }
00258 
00259   inline double deltaRap(const ParticleBase& p, const FourMomentum& v) {
00260     return deltaRap(p.momentum(), v);
00261   }
00262 
00263   inline double deltaRap(const ParticleBase& p, double y) {
00264     return deltaRap(p.momentum(), y);
00265   }
00266 
00267   inline double deltaRap(const FourMomentum& v, const ParticleBase& p) {
00268     return deltaRap(v, p.momentum());
00269   }
00270 
00271   inline double deltaRap(double y, const ParticleBase& p) {
00272     return deltaRap(y, p.momentum());
00273   }
00274 
00275   //@}
00276 
00277 
00278 }
00279 
00280 #endif