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