rivet is hosted by Hepforge, IPPP Durham
Spherocity.hh
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #ifndef RIVET_Spherocity_HH
00003 #define RIVET_Spherocity_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 namespace Rivet {
00011 
00012 
00013   /**
00014     @brief Get the transverse spherocity scalars for hadron-colliders.
00015 
00016     @author Holger Schulz
00017 
00018     The scalar (maximum) transverse spherocity is defined as
00019     \f[
00020     T = \mathrm{max}_{\vec{n_\perp}} \frac{\sum_i \left|\vec{p}_{\perp,i} \cdot \vec{n} \right|}{\sum_i |\vec{p}_{\perp,i}|}
00021     \f],
00022     with the direction of the unit vector \f$ \vec{n_\perp} \f$ which maximises \f$ T \f$
00023     being identified as the spherocity axis. The unit vector which maximises the spherocity
00024     scalar in the plane perpendicular to \f$ \vec{n} \f$ is the "spherocity major"
00025     direction, and the vector perpendicular to both the spherocity and spherocity major directions
00026     is the spherocity minor. Both the major and minor directions have associated spherocity
00027     scalars.
00028 
00029     Care must be taken in the case of Drell-Yan processes - there we should use the
00030     newly proposed observable \f$ a_T \f$.
00031 
00032    */
00033   class Spherocity : public AxesDefinition {
00034   public:
00035 
00036     // Default Constructor
00037     Spherocity() {}
00038 
00039     /// Constructor.
00040     Spherocity(const FinalState& fsp)
00041       : _calculatedSpherocity(false)
00042     {
00043       setName("Spherocity");
00044       addProjection(fsp, "FS");
00045     }
00046 
00047     /// Clone on the heap.
00048     virtual const Projection* clone() const {
00049       return new Spherocity(*this);
00050     }
00051 
00052 
00053   protected:
00054 
00055     /// Perform the projection on the Event
00056     void project(const Event& e) {
00057       const vector<Particle> ps
00058         = applyProjection<FinalState>(e, "FS").particles();
00059       calc(ps);
00060     }
00061 
00062 
00063     /// Compare projections
00064     int compare(const Projection& p) const {
00065       return mkNamedPCmp(p, "FS");
00066     }
00067 
00068 
00069   public:
00070 
00071     ///@{ Spherocity scalar accessors
00072     /// The spherocity scalar, \f$ S \f$, (minimum spherocity).
00073     double spherocity() const { return _spherocities[0]; }
00074     ///@}
00075 
00076 
00077     ///@{ Spherocity axis accessors
00078     /// The spherocity axis.
00079     const Vector3& spherocityAxis() const { return _spherocityAxes[0]; }
00080     /// The spherocity major axis (axis of max spherocity perpendicular to spherocity axis).
00081     const Vector3& spherocityMajorAxis() const { return _spherocityAxes[1]; }
00082     /// The spherocity minor axis (axis perpendicular to spherocity and spherocity major).
00083     const Vector3& spherocityMinorAxis() const { return _spherocityAxes[2]; }
00084     ///@}
00085 
00086 
00087     ///@{ AxesDefinition axis accessors.
00088     const Vector3& axis1() const { return spherocityAxis(); }
00089     const Vector3& axis2() const { return spherocityMajorAxis(); }
00090     const Vector3& axis3() const { return spherocityMinorAxis(); }
00091     ///@}
00092 
00093 
00094   public:
00095 
00096     /// @name Direct methods
00097     /// Ways to do the calculation directly, without engaging the caching system
00098     //@{
00099 
00100     /// Manually calculate the spherocity, without engaging the caching system
00101     void calc(const FinalState& fs);
00102 
00103     /// Manually calculate the spherocity, without engaging the caching system
00104     void calc(const vector<Particle>& fsparticles);
00105 
00106     /// Manually calculate the spherocity, without engaging the caching system
00107     void calc(const vector<FourMomentum>& fsmomenta);
00108 
00109     /// Manually calculate the spherocity, without engaging the caching system
00110     void calc(const vector<Vector3>& threeMomenta);
00111 
00112     //@}
00113 
00114 
00115   private:
00116 
00117     /// The spherocity scalars.
00118     vector<double> _spherocities;
00119 
00120     /// The spherocity axes.
00121     vector<Vector3> _spherocityAxes;
00122 
00123     /// Caching flag to avoid costly recalculations.
00124     bool _calculatedSpherocity;
00125 
00126 
00127   private:
00128 
00129     /// Explicitly calculate the spherocity values.
00130     void _calcSpherocity(const vector<Vector3>& fsmomenta);
00131 
00132   };
00133 
00134 }
00135 
00136 #endif