Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:57:15

0001 // $Id: SoftDrop.hh 1034 2017-08-01 10:03:53Z gsoyez $
0002 //
0003 // Copyright (c) 2014-, Gregory Soyez, Jesse Thaler
0004 // based on arXiv:1402.2657 by Andrew J. Larkoski, Simone Marzani,
0005 // Gregory Soyez, Jesse Thaler
0006 //
0007 //----------------------------------------------------------------------
0008 // This file is part of FastJet contrib.
0009 //
0010 // It is free software; you can redistribute it and/or modify it under
0011 // the terms of the GNU General Public License as published by the
0012 // Free Software Foundation; either version 2 of the License, or (at
0013 // your option) any later version.
0014 //
0015 // It is distributed in the hope that it will be useful, but WITHOUT
0016 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
0017 // or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
0018 // License for more details.
0019 //
0020 // You should have received a copy of the GNU General Public License
0021 // along with this code. If not, see <http://www.gnu.org/licenses/>.
0022 //----------------------------------------------------------------------
0023 
0024 #ifndef __FASTJET_CONTRIB_SOFTDROP_HH__
0025 #define __FASTJET_CONTRIB_SOFTDROP_HH__
0026 
0027 #include "RecursiveSymmetryCutBase.hh"
0028 
0029 FASTJET_BEGIN_NAMESPACE      // defined in fastjet/internal/base.hh
0030 
0031 
0032 namespace contrib{
0033 
0034 //------------------------------------------------------------------------
0035 /// \class SoftDrop
0036 /// An implementation of the SoftDrop from arXiv:1402.2657.
0037 ///
0038 /// For the basic functionalities, we refer the reader to the
0039 /// documentation of the RecursiveSymmetryCutBase from which SoftDrop
0040 /// inherits. Here, we mostly put the emphasis on things specific to
0041 /// SoftDrop:
0042 ///
0043 ///  - the cut applied recursively is 
0044 ///     \f[
0045 ///        z > z_{\rm cut} (\theta/R0)^\beta
0046 ///     \f]
0047 ///    with z the asymmetry measure and \f$\theta\f$ the geometrical
0048 ///    distance between the two subjets. R0 is set to 1 by default.
0049 ///
0050 ///  - by default, we work in "grooming mode" i.s. if no substructure
0051 ///    is found, we return a jet made of a single parton. Note that
0052 ///    this behaviour differs from the mMDT (and can be a source of
0053 ///    differences when running SoftDrop with beta=0.)
0054 ///
0055 class SoftDrop : public RecursiveSymmetryCutBase {
0056 public:
0057   /// Simplified constructor. This takes the value of the "beta"
0058   /// parameter and the symmetry cut (applied by default on the
0059   /// scalar_z variable, as for the mMDT). It also takes an optional
0060   /// subtractor.
0061   ///
0062   /// If the (optional) pileup subtractor can be supplied, then see
0063   /// also the documentation for the set_input_jet_is_subtracted() member
0064   /// function.
0065   ///
0066   /// \param beta               the value of the beta parameter
0067   /// \param symmetry_cut       the value of the cut on the symmetry measure
0068   /// \param R0                 the angular distance normalisation [1 by default]
0069   SoftDrop(double beta,
0070            double symmetry_cut,
0071            double R0 = 1,
0072            const FunctionOfPseudoJet<PseudoJet> * subtractor = 0) : 
0073     RecursiveSymmetryCutBase(scalar_z,  // the default SymmetryMeasure
0074                              std::numeric_limits<double>::infinity(), // default is no mass drop
0075                              larger_pt, // the default RecursionChoice
0076                              subtractor),
0077     _beta(beta), _symmetry_cut(symmetry_cut), _R0sqr(R0*R0) {
0078     // change the default: use grooming mode
0079     set_grooming_mode();
0080   }
0081 
0082   /// Full constructor, which takes the following parameters:
0083   ///
0084   /// \param beta               the value of the beta parameter
0085   /// \param symmetry_cut       the value of the cut on the symmetry measure
0086   /// \param symmetry_measure   the choice of measure to use to estimate the symmetry
0087   /// \param R0                 the angular distance normalisation [1 by default]
0088   /// \param mu_cut             the maximal allowed value of mass drop variable mu = m_heavy/m_parent 
0089   /// \param recursion_choice   the strategy used to decide which subjet to recurse into
0090   /// \param subtractor         an optional pointer to a pileup subtractor (ignored if zero)
0091   ///
0092   /// The default values provided for this constructor are suited to
0093   /// obtain the SoftDrop as discussed in arXiv:1402.2657:
0094   ///  - no mass drop is requested
0095   ///  - recursion follows the branch with the largest pt
0096   /// The symmetry measure has to be specified (scalar_z is the recommended value)
0097   ///
0098   /// Notes: 
0099   ///
0100   /// - by default, SoftDrop will recluster the jet with the
0101   ///   Cambridge/Aachen algorithm if it is not already the case. This
0102   ///   behaviour can be changed using the "set_reclustering" method
0103   ///   defined below
0104   ///
0105   SoftDrop(double           beta,
0106            double           symmetry_cut, 
0107            SymmetryMeasure  symmetry_measure,
0108            double           R0 = 1.0,
0109            double           mu_cut = std::numeric_limits<double>::infinity(), 
0110            RecursionChoice  recursion_choice = larger_pt,
0111            const FunctionOfPseudoJet<PseudoJet> * subtractor = 0) : 
0112      RecursiveSymmetryCutBase(symmetry_measure, mu_cut, recursion_choice, subtractor),
0113      _beta(beta), _symmetry_cut(symmetry_cut), _R0sqr(R0*R0)
0114   {
0115     // change the default: use grooming mode
0116     set_grooming_mode();
0117   }
0118 
0119   /// default destructor
0120   virtual ~SoftDrop(){}
0121 
0122   //----------------------------------------------------------------------
0123   // access to class info
0124   double beta()         const { return _beta; }
0125   double symmetry_cut() const { return _symmetry_cut; }
0126   double R0()           const { return sqrt(_R0sqr); }
0127   
0128 protected:
0129 
0130   // Unlike MMDT, the SoftDrop symmetry_cut_fn depends on the subjet kinematics
0131   // since the symmetry condition depends on the DeltaR between subjets.
0132   virtual double symmetry_cut_fn(const PseudoJet & p1, 
0133                                  const PseudoJet & p2,
0134                                  void * optional_R0sqr_ptr = 0) const;
0135   virtual std::string symmetry_cut_description() const;
0136 
0137   //private:
0138   double _beta;         ///< the power of the angular distance to be used
0139                         ///< in the symmetry condition
0140   double _symmetry_cut; ///< the value of zcut (the prefactor in the asymmetry cut)
0141   double _R0sqr;        ///< normalisation of the angular distance
0142                         ///< (typically set to the jet radius, 1 by default)
0143 };
0144 
0145 } // namespace contrib
0146 
0147 FASTJET_END_NAMESPACE
0148 
0149 #endif  // __FASTJET_CONTRIB_SOFTDROP_HH__