[b7b836a] | 1 | // $Id: SoftDrop.hh 1034 2017-08-01 10:03:53Z gsoyez $
|
---|
[1f1f858] | 2 | //
|
---|
| 3 | // Copyright (c) 2014-, Gregory Soyez, Jesse Thaler
|
---|
| 4 | // based on arXiv:1402.2657 by Andrew J. Larkoski, Simone Marzani,
|
---|
| 5 | // Gregory Soyez, Jesse Thaler
|
---|
| 6 | //
|
---|
| 7 | //----------------------------------------------------------------------
|
---|
| 8 | // This file is part of FastJet contrib.
|
---|
| 9 | //
|
---|
| 10 | // It is free software; you can redistribute it and/or modify it under
|
---|
| 11 | // the terms of the GNU General Public License as published by the
|
---|
| 12 | // Free Software Foundation; either version 2 of the License, or (at
|
---|
| 13 | // your option) any later version.
|
---|
| 14 | //
|
---|
| 15 | // It is distributed in the hope that it will be useful, but WITHOUT
|
---|
| 16 | // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
---|
| 17 | // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
---|
| 18 | // License for more details.
|
---|
| 19 | //
|
---|
| 20 | // You should have received a copy of the GNU General Public License
|
---|
| 21 | // along with this code. If not, see <http://www.gnu.org/licenses/>.
|
---|
| 22 | //----------------------------------------------------------------------
|
---|
| 23 |
|
---|
| 24 | #ifndef __FASTJET_CONTRIB_SOFTDROP_HH__
|
---|
| 25 | #define __FASTJET_CONTRIB_SOFTDROP_HH__
|
---|
| 26 |
|
---|
| 27 | #include "RecursiveSymmetryCutBase.hh"
|
---|
| 28 |
|
---|
| 29 | FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh
|
---|
| 30 |
|
---|
| 31 |
|
---|
| 32 | namespace contrib{
|
---|
| 33 |
|
---|
| 34 | //------------------------------------------------------------------------
|
---|
| 35 | /// \class SoftDrop
|
---|
| 36 | /// An implementation of the SoftDrop from arXiv:1402.2657.
|
---|
| 37 | ///
|
---|
| 38 | /// For the basic functionalities, we refer the reader to the
|
---|
| 39 | /// documentation of the RecursiveSymmetryCutBase from which SoftDrop
|
---|
| 40 | /// inherits. Here, we mostly put the emphasis on things specific to
|
---|
| 41 | /// SoftDrop:
|
---|
| 42 | ///
|
---|
| 43 | /// - the cut applied recursively is
|
---|
| 44 | /// \f[
|
---|
| 45 | /// z > z_{\rm cut} (\theta/R0)^\beta
|
---|
| 46 | /// \f]
|
---|
| 47 | /// with z the asymmetry measure and \f$\theta\f$ the geometrical
|
---|
| 48 | /// distance between the two subjets. R0 is set to 1 by default.
|
---|
| 49 | ///
|
---|
| 50 | /// - by default, we work in "grooming mode" i.s. if no substructure
|
---|
| 51 | /// is found, we return a jet made of a single parton. Note that
|
---|
| 52 | /// this behaviour differs from the mMDT (and can be a source of
|
---|
| 53 | /// differences when running SoftDrop with beta=0.)
|
---|
| 54 | ///
|
---|
| 55 | class SoftDrop : public RecursiveSymmetryCutBase {
|
---|
| 56 | public:
|
---|
| 57 | /// Simplified constructor. This takes the value of the "beta"
|
---|
| 58 | /// parameter and the symmetry cut (applied by default on the
|
---|
| 59 | /// scalar_z variable, as for the mMDT). It also takes an optional
|
---|
| 60 | /// subtractor.
|
---|
| 61 | ///
|
---|
| 62 | /// If the (optional) pileup subtractor can be supplied, then see
|
---|
| 63 | /// also the documentation for the set_input_jet_is_subtracted() member
|
---|
| 64 | /// function.
|
---|
| 65 | ///
|
---|
| 66 | /// \param beta the value of the beta parameter
|
---|
| 67 | /// \param symmetry_cut the value of the cut on the symmetry measure
|
---|
| 68 | /// \param R0 the angular distance normalisation [1 by default]
|
---|
| 69 | SoftDrop(double beta,
|
---|
| 70 | double symmetry_cut,
|
---|
| 71 | double R0 = 1,
|
---|
| 72 | const FunctionOfPseudoJet<PseudoJet> * subtractor = 0) :
|
---|
| 73 | RecursiveSymmetryCutBase(scalar_z, // the default SymmetryMeasure
|
---|
| 74 | std::numeric_limits<double>::infinity(), // default is no mass drop
|
---|
| 75 | larger_pt, // the default RecursionChoice
|
---|
| 76 | subtractor),
|
---|
| 77 | _beta(beta), _symmetry_cut(symmetry_cut), _R0sqr(R0*R0) {
|
---|
| 78 | // change the default: use grooming mode
|
---|
| 79 | set_grooming_mode();
|
---|
| 80 | }
|
---|
| 81 |
|
---|
| 82 | /// Full constructor, which takes the following parameters:
|
---|
| 83 | ///
|
---|
| 84 | /// \param beta the value of the beta parameter
|
---|
| 85 | /// \param symmetry_cut the value of the cut on the symmetry measure
|
---|
| 86 | /// \param symmetry_measure the choice of measure to use to estimate the symmetry
|
---|
| 87 | /// \param R0 the angular distance normalisation [1 by default]
|
---|
| 88 | /// \param mu_cut the maximal allowed value of mass drop variable mu = m_heavy/m_parent
|
---|
| 89 | /// \param recursion_choice the strategy used to decide which subjet to recurse into
|
---|
| 90 | /// \param subtractor an optional pointer to a pileup subtractor (ignored if zero)
|
---|
| 91 | ///
|
---|
| 92 | /// The default values provided for this constructor are suited to
|
---|
| 93 | /// obtain the SoftDrop as discussed in arXiv:1402.2657:
|
---|
| 94 | /// - no mass drop is requested
|
---|
| 95 | /// - recursion follows the branch with the largest pt
|
---|
| 96 | /// The symmetry measure has to be specified (scalar_z is the recommended value)
|
---|
| 97 | ///
|
---|
| 98 | /// Notes:
|
---|
| 99 | ///
|
---|
| 100 | /// - by default, SoftDrop will recluster the jet with the
|
---|
| 101 | /// Cambridge/Aachen algorithm if it is not already the case. This
|
---|
| 102 | /// behaviour can be changed using the "set_reclustering" method
|
---|
| 103 | /// defined below
|
---|
| 104 | ///
|
---|
| 105 | SoftDrop(double beta,
|
---|
| 106 | double symmetry_cut,
|
---|
| 107 | SymmetryMeasure symmetry_measure,
|
---|
| 108 | double R0 = 1.0,
|
---|
| 109 | double mu_cut = std::numeric_limits<double>::infinity(),
|
---|
| 110 | RecursionChoice recursion_choice = larger_pt,
|
---|
| 111 | const FunctionOfPseudoJet<PseudoJet> * subtractor = 0) :
|
---|
| 112 | RecursiveSymmetryCutBase(symmetry_measure, mu_cut, recursion_choice, subtractor),
|
---|
| 113 | _beta(beta), _symmetry_cut(symmetry_cut), _R0sqr(R0*R0)
|
---|
[b7b836a] | 114 | {
|
---|
| 115 | // change the default: use grooming mode
|
---|
| 116 | set_grooming_mode();
|
---|
| 117 | }
|
---|
[1f1f858] | 118 |
|
---|
| 119 | /// default destructor
|
---|
| 120 | virtual ~SoftDrop(){}
|
---|
| 121 |
|
---|
[b7b836a] | 122 | //----------------------------------------------------------------------
|
---|
| 123 | // access to class info
|
---|
| 124 | double beta() const { return _beta; }
|
---|
| 125 | double symmetry_cut() const { return _symmetry_cut; }
|
---|
| 126 | double R0() const { return sqrt(_R0sqr); }
|
---|
| 127 |
|
---|
[1f1f858] | 128 | protected:
|
---|
| 129 |
|
---|
| 130 | // Unlike MMDT, the SoftDrop symmetry_cut_fn depends on the subjet kinematics
|
---|
| 131 | // since the symmetry condition depends on the DeltaR between subjets.
|
---|
[b7b836a] | 132 | virtual double symmetry_cut_fn(const PseudoJet & p1,
|
---|
| 133 | const PseudoJet & p2,
|
---|
| 134 | void * optional_R0sqr_ptr = 0) const;
|
---|
[1f1f858] | 135 | virtual std::string symmetry_cut_description() const;
|
---|
| 136 |
|
---|
[b7b836a] | 137 | //private:
|
---|
[1f1f858] | 138 | double _beta; ///< the power of the angular distance to be used
|
---|
| 139 | ///< in the symmetry condition
|
---|
| 140 | double _symmetry_cut; ///< the value of zcut (the prefactor in the asymmetry cut)
|
---|
| 141 | double _R0sqr; ///< normalisation of the angular distance
|
---|
| 142 | ///< (typically set to the jet radius, 1 by default)
|
---|
| 143 | };
|
---|
| 144 |
|
---|
| 145 | } // namespace contrib
|
---|
| 146 |
|
---|
| 147 | FASTJET_END_NAMESPACE
|
---|
| 148 |
|
---|
| 149 | #endif // __FASTJET_CONTRIB_SOFTDROP_HH__
|
---|