Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-05-12 09:05:03

0001 // -*- C++ -*-
0002 #ifndef RIVET_Thrust_HH
0003 #define RIVET_Thrust_HH
0004 
0005 #include "Rivet/Projection.hh"
0006 #include "Rivet/Projections/AxesDefinition.hh"
0007 #include "Rivet/Projections/FinalState.hh"
0008 #include "Rivet/Event.hh"
0009 
0010 namespace Rivet {
0011 
0012 
0013   /// @brief Get the e+ e- thrust basis and the thrust, thrust major and thrust minor scalars.
0014   ///
0015   /// @author Andy Buckley
0016   ///
0017   /// The scalar (maximum) thrust is defined as
0018   /// \f[
0019   /// T = \mathrm{max}_{\vec{n}} \frac{\sum_i \left|\vec{p}_i \cdot \vec{n} \right|}{\sum_i |\vec{p}_i|}
0020   /// \f],
0021   /// with the direction of the unit vector \f$ \vec{n} \f$ which maximises \f$ T \f$
0022   /// being identified as the thrust axis. The unit vector which maximises the thrust
0023   /// scalar in the plane perpendicular to \f$ \vec{n} \f$ is the "thrust major"
0024   /// direction, and the vector perpendicular to both the thrust and thrust major directions
0025   /// is the thrust minor. Both the major and minor directions have associated thrust
0026   /// scalars.
0027   ///
0028   /// Thrust calculations have particularly simple forms for less than 4 particles, and
0029   /// in those cases this projection is computationally minimal. For 4 or more particles,
0030   /// a more general calculation must be carried out, based on the Brandt/Dahmen method
0031   /// from Z. Phys. C1 (1978). While a polynomial improvement on the exponential scaling
0032   /// of the naive method, this algorithm scales asymptotically as
0033   /// \f$ \mathcal{O}\left( n^3 \right) \f$. Be aware that the thrust may easily be the
0034   /// most computationally demanding projection in Rivet for large events!
0035   ///
0036   /// The Rivet implementation of thrust is based heavily on Stefan Gieseke's Herwig++
0037   /// re-coding of the 'tasso' code from HERWIG.
0038   ///
0039   /// NB. special case with >= 4 coplanar particles will still fail.
0040   /// NB. Thrust assumes all momenta are in the CoM system: no explicit boost is performed.
0041   ///   This can be dealt with by appropriate choice of the supplied FinalState.
0042   class Thrust : public AxesDefinition {
0043   public:
0044 
0045     using AxesDefinition::operator=;
0046 
0047     /// Constructor.
0048     Thrust() {}
0049 
0050     Thrust(const FinalState& fsp) {
0051       setName("Thrust");
0052       declare(fsp, "FS");
0053     }
0054 
0055     /// Clone on the heap.
0056     RIVET_DEFAULT_PROJ_CLONE(Thrust);
0057 
0058     /// Import to avoid warnings about overload-hiding
0059     using Projection::operator =;
0060 
0061 
0062   protected:
0063 
0064     /// Perform the projection on the Event
0065     void project(const Event& e) {
0066       const vector<Particle> ps
0067         = apply<FinalState>(e, "FS").particles();
0068       calc(ps);
0069     }
0070 
0071     /// Compare projections
0072     CmpState compare(const Projection& p) const {
0073       return mkNamedPCmp(p, "FS");
0074     }
0075 
0076 
0077   public:
0078 
0079     /// @{ Thrust scalar accessors
0080     /// The thrust scalar, \f$ T \f$, (maximum thrust).
0081     double thrust() const { return _thrusts[0]; }
0082     /// The thrust major scalar, \f$ M \f$, (thrust along thrust major axis).
0083     double thrustMajor() const { return _thrusts[1]; }
0084     /// The thrust minor scalar, \f$ m \f$, (thrust along thrust minor axis).
0085     double thrustMinor() const { return _thrusts[2]; }
0086     /// The oblateness, \f$ O = M - m \f$ .
0087     double oblateness() const { return _thrusts[1] - _thrusts[2]; }
0088     /// @}
0089 
0090     /// @{ Thrust axis accessors
0091     /// The thrust axis.
0092     const Vector3& thrustAxis() const { return _thrustAxes[0]; }
0093     /// The thrust major axis (axis of max thrust perpendicular to thrust axis).
0094     const Vector3& thrustMajorAxis() const { return _thrustAxes[1]; }
0095     /// The thrust minor axis (axis perpendicular to thrust and thrust major).
0096     const Vector3& thrustMinorAxis() const { return _thrustAxes[2]; }
0097     /// @}
0098 
0099     /// @{ AxesDefinition axis accessors.
0100     const Vector3& axis1() const { return thrustAxis(); }
0101     const Vector3& axis2() const { return thrustMajorAxis(); }
0102     const Vector3& axis3() const { return thrustMinorAxis(); }
0103     /// @}
0104 
0105 
0106   public:
0107 
0108     /// @name Direct methods
0109     /// Ways to do the calculation directly, without engaging the caching system
0110     /// @{
0111 
0112     /// Manually calculate the thrust, without engaging the caching system
0113     void calc(const FinalState& fs);
0114 
0115     /// Manually calculate the thrust, without engaging the caching system
0116     void calc(const vector<Particle>& fsparticles);
0117 
0118     /// Manually calculate the thrust, without engaging the caching system
0119     void calc(const vector<FourMomentum>& fsmomenta);
0120 
0121     /// Manually calculate the thrust, without engaging the caching system
0122     void calc(const vector<Vector3>& threeMomenta);
0123 
0124     /// @}
0125 
0126 
0127   protected:
0128 
0129     /// The thrust scalars.
0130     vector<double> _thrusts;
0131 
0132     /// The thrust axes.
0133     vector<Vector3> _thrustAxes;
0134 
0135 
0136   protected:
0137 
0138     /// Explicitly calculate the thrust values.
0139     void _calcThrust(const vector<Vector3>& fsmomenta);
0140 
0141   };
0142 
0143 }
0144 
0145 #endif