1 | // $Id: SoftDrop.hh 1034 2017-08-01 10:03:53Z gsoyez $
|
---|
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)
|
---|
114 | {
|
---|
115 | // change the default: use grooming mode
|
---|
116 | set_grooming_mode();
|
---|
117 | }
|
---|
118 |
|
---|
119 | /// default destructor
|
---|
120 | virtual ~SoftDrop(){}
|
---|
121 |
|
---|
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 |
|
---|
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.
|
---|
132 | virtual double symmetry_cut_fn(const PseudoJet & p1,
|
---|
133 | const PseudoJet & p2,
|
---|
134 | void * optional_R0sqr_ptr = 0) const;
|
---|
135 | virtual std::string symmetry_cut_description() const;
|
---|
136 |
|
---|
137 | //private:
|
---|
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__
|
---|