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(const FinalState& fsp, double rparam=2.0);
00060 
00061     /// Clone on the heap.
00062     virtual const Projection* clone() const {
00063       return new Sphericity(*this);
00064     }
00065 
00066     //@}
00067 
00068 
00069   protected:
00070 
00071     /// Perform the projection on the Event
00072     void project(const Event& e);
00073 
00074     /// Compare with other projections
00075     int compare(const Projection& p) const;
00076 
00077   public:
00078 
00079     /// Reset the projection
00080     void clear();
00081 
00082     /// @name Access the event shapes by name
00083     /// @{
00084     /// Sphericity
00085     double sphericity() const { return 3.0 / 2.0 * (lambda2() + lambda3()); }
00086     /// Transverse Sphericity
00087     double transSphericity() const { return 2.0 * lambda2() / ( lambda1() + lambda2() ); }
00088     /// Planarity
00089     double planarity() const { return 2 * (sphericity() - 2 * aplanarity()) / 3.0; }
00090     /// Aplanarity
00091     double aplanarity() const { return 3 / 2.0 * lambda3(); }
00092     /// @}
00093 
00094     /// @name Access the sphericity basis vectors
00095     /// @{
00096     /// Sphericity axis
00097     const Vector3& sphericityAxis() const { return _sphAxes[0]; }
00098     /// Sphericity major axis
00099     const Vector3& sphericityMajorAxis() const { return _sphAxes[1]; }
00100     /// Sphericity minor axis
00101     const Vector3& sphericityMinorAxis() const { return _sphAxes[2]; }
00102     /// @}
00103 
00104     ///@{ AxesDefinition axis accessors.
00105     const Vector3& axis1() const { return sphericityAxis(); }
00106     const Vector3& axis2() const { return sphericityMajorAxis(); }
00107     const Vector3& axis3() const { return sphericityMinorAxis(); }
00108     ///@}
00109 
00110 
00111     /// @name Access the momentum tensor eigenvalues
00112     /// @{
00113     double lambda1() const { return _lambdas[0]; }
00114     double lambda2() const { return _lambdas[1]; }
00115     double lambda3() const { return _lambdas[2]; }
00116     /// @}
00117 
00118 
00119     /// @name Direct methods
00120     /// Ways to do the calculation directly, without engaging the caching system
00121     //@{
00122  
00123     /// Manually calculate the sphericity, without engaging the caching system
00124     void calc(const FinalState& fs);
00125 
00126     /// Manually calculate the sphericity, without engaging the caching system
00127     void calc(const vector<Particle>& fsparticles);
00128 
00129     /// Manually calculate the sphericity, without engaging the caching system
00130     void calc(const vector<FourMomentum>& fsmomenta);
00131 
00132     /// Manually calculate the sphericity, without engaging the caching system
00133     void calc(const vector<Vector3>& fsmomenta);
00134 
00135     //@}
00136 
00137 
00138 
00139   private:
00140     /// Eigenvalues.
00141     vector<double> _lambdas;
00142 
00143     /// Sphericity axes.
00144     vector<Vector3> _sphAxes;
00145 
00146     /// Regularizing parameter, used to force infra-red safety.
00147     const double _regparam;
00148 
00149   private:
00150 
00151     /// Actually do the calculation
00152     void _calcSphericity(const vector<Vector3>& fsmomenta);
00153 
00154   };
00155 
00156 }
00157 
00158 
00159 #endif