rivet is hosted by Hepforge, IPPP Durham
Sphericity.hh
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #ifndef RIVET_Sphericity_HH
00003 #define RIVET_Sphericity_HH
00004 
00005 #include "Rivet/Projection.hh"
00006 #include "Rivet/Projections/AxesDefinition.hh"
00007 #include "Rivet/Projections/FinalState.hh"
00008 #include "Rivet/Event.hh"
00009 
00010 
00011 namespace Rivet {
00012 
00013   /**
00014      @brief Calculate the sphericity event shape.
00015   
00016      The sphericity tensor (or quadratic momentum tensor) is defined as
00017      \f[
00018      S^{\alpha \beta} = \frac{\sum_i p_i^\alpha p_i^\beta}{\sum_i |\mathbf{p}_i|^2}
00019      \f],
00020      where the Greek indices are spatial components and the Latin indices are used
00021      for sums over particles. From this, the sphericity, aplanarity and planarity can be
00022      calculated by combinations of eigenvalues.
00023   
00024      Defining the three eigenvalues
00025      \f$ \lambda_1 \ge \lambda_2 \ge \lambda_3 \f$, with \f$ \lambda_1 + \lambda_2 + \lambda_3 = 1 \f$,
00026      the sphericity is
00027      \f[
00028      S = \frac{3}{2} (\lambda_2 + \lambda_3)
00029      \f]
00030   
00031      The aplanarity is \f$ A = \frac{3}{2}\lambda_3 \f$ and the planarity
00032      is \f$ P = \frac{2}{3}(S-2A) = \lambda_2 - \lambda_3 \f$. The eigenvectors define a
00033      set of spatial axes comparable with the thrust axes, but more sensitive to
00034      high momentum particles due to the quadratic sensitivity of the tensor to
00035      the particle momenta.
00036   
00037      Since the sphericity is quadratic in the particle momenta, it is not an
00038      infrared safe observable in perturbative QCD. This can be fixed by adding
00039      a regularizing power of \f$r\f$ to the definition:
00040      \f[
00041      S^{\alpha \beta} =
00042      \frac{\sum_i |\mathbf{p}_i|^{r-2} p_i^\alpha p_i^\beta}
00043      {\sum_i |\mathbf{p}_i|^r}
00044      \f]
00045   
00046      \f$r\f$ is available as a constructor argument on this class and will be
00047      taken into account by the Cmp<Projection> operation, so a single analysis
00048      can use several sphericity projections with different \f$r\f$ values without
00049      fear of a clash.
00050   */
00051   class Sphericity : public AxesDefinition {
00052 
00053   public:
00054 
00055     /// @name Constructors etc.
00056     //@{
00057 
00058     /// Constructor
00059     Sphericity(double rparam=2.0): _regparam(rparam){}
00060 
00061     Sphericity(const FinalState& fsp, double rparam=2.0);
00062 
00063     /// Clone on the heap.
00064     virtual const Projection* clone() const {
00065       return new Sphericity(*this);
00066     }
00067 
00068     //@}
00069 
00070 
00071   protected:
00072 
00073     /// Perform the projection on the Event
00074     void project(const Event& e);
00075 
00076     /// Compare with other projections
00077     int compare(const Projection& p) const;
00078 
00079   public:
00080 
00081     /// Reset the projection
00082     void clear();
00083 
00084     /// @name Access the event shapes by name
00085     /// @{
00086     /// Sphericity
00087     double sphericity() const { return 3.0 / 2.0 * (lambda2() + lambda3()); }
00088     /// Transverse Sphericity
00089     double transSphericity() const { return 2.0 * lambda2() / ( lambda1() + lambda2() ); }
00090     /// Planarity
00091     double planarity() const { return 2 * (sphericity() - 2 * aplanarity()) / 3.0; }
00092     /// Aplanarity
00093     double aplanarity() const { return 3 / 2.0 * lambda3(); }
00094     /// @}
00095 
00096     /// @name Access the sphericity basis vectors
00097     /// @{
00098     /// Sphericity axis
00099     const Vector3& sphericityAxis() const { return _sphAxes[0]; }
00100     /// Sphericity major axis
00101     const Vector3& sphericityMajorAxis() const { return _sphAxes[1]; }
00102     /// Sphericity minor axis
00103     const Vector3& sphericityMinorAxis() const { return _sphAxes[2]; }
00104     /// @}
00105 
00106     ///@{ AxesDefinition axis accessors.
00107     const Vector3& axis1() const { return sphericityAxis(); }
00108     const Vector3& axis2() const { return sphericityMajorAxis(); }
00109     const Vector3& axis3() const { return sphericityMinorAxis(); }
00110     ///@}
00111 
00112 
00113     /// @name Access the momentum tensor eigenvalues
00114     /// @{
00115     double lambda1() const { return _lambdas[0]; }
00116     double lambda2() const { return _lambdas[1]; }
00117     double lambda3() const { return _lambdas[2]; }
00118     /// @}
00119 
00120 
00121     /// @name Direct methods
00122     /// Ways to do the calculation directly, without engaging the caching system
00123     //@{
00124  
00125     /// Manually calculate the sphericity, without engaging the caching system
00126     void calc(const FinalState& fs);
00127 
00128     /// Manually calculate the sphericity, without engaging the caching system
00129     void calc(const vector<Particle>& fsparticles);
00130 
00131     /// Manually calculate the sphericity, without engaging the caching system
00132     void calc(const vector<FourMomentum>& fsmomenta);
00133 
00134     /// Manually calculate the sphericity, without engaging the caching system
00135     void calc(const vector<Vector3>& fsmomenta);
00136 
00137     //@}
00138 
00139 
00140 
00141   private:
00142     /// Eigenvalues.
00143     vector<double> _lambdas;
00144 
00145     /// Sphericity axes.
00146     vector<Vector3> _sphAxes;
00147 
00148     /// Regularizing parameter, used to force infra-red safety.
00149     const double _regparam;
00150 
00151   private:
00152 
00153     /// Actually do the calculation
00154     void _calcSphericity(const vector<Vector3>& fsmomenta);
00155 
00156   };
00157 
00158 }
00159 
00160 
00161 #endif