[b7b836a] | 1 | // $Id: IteratedSoftDrop.hh 1086 2017-10-11 08:07:26Z gsoyez $
|
---|
| 2 | //
|
---|
| 3 | // Copyright (c) 2017-, Jesse Thaler, Kevin Zhou, Gavin P. Salam,
|
---|
| 4 | // Gregory Soyez
|
---|
| 5 | //
|
---|
| 6 | // based on arXiv:1704.06266 by Christopher Frye, Andrew J. Larkoski,
|
---|
| 7 | // Jesse Thaler, Kevin Zhou
|
---|
| 8 | //
|
---|
| 9 | //----------------------------------------------------------------------
|
---|
| 10 | // This file is part of FastJet contrib.
|
---|
| 11 | //
|
---|
| 12 | // It is free software; you can redistribute it and/or modify it under
|
---|
| 13 | // the terms of the GNU General Public License as published by the
|
---|
| 14 | // Free Software Foundation; either version 2 of the License, or (at
|
---|
| 15 | // your option) any later version.
|
---|
| 16 | //
|
---|
| 17 | // It is distributed in the hope that it will be useful, but WITHOUT
|
---|
| 18 | // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
---|
| 19 | // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
---|
| 20 | // License for more details.
|
---|
| 21 | //
|
---|
| 22 | // You should have received a copy of the GNU General Public License
|
---|
| 23 | // along with this code. If not, see <http://www.gnu.org/licenses/>.
|
---|
| 24 | //----------------------------------------------------------------------
|
---|
| 25 |
|
---|
| 26 | #ifndef __FASTJET_CONTRIB_ITERATEDSOFTDROP_HH__
|
---|
| 27 | #define __FASTJET_CONTRIB_ITERATEDSOFTDROP_HH__
|
---|
| 28 |
|
---|
| 29 | #include "RecursiveSoftDrop.hh"
|
---|
| 30 |
|
---|
| 31 | FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh
|
---|
| 32 |
|
---|
| 33 | namespace contrib{
|
---|
| 34 |
|
---|
| 35 | //------------------------------------------------------------------------
|
---|
| 36 | /// \class IteratedSoftDropInfo
|
---|
| 37 | /// helper class that carries all the relevant information one can get
|
---|
| 38 | /// from running IteratedSoftDrop on a given jet (or vector of jets)
|
---|
| 39 | ///
|
---|
| 40 | class IteratedSoftDropInfo{
|
---|
| 41 | public:
|
---|
| 42 | /// ctor without initialisation
|
---|
| 43 | IteratedSoftDropInfo(){}
|
---|
| 44 |
|
---|
| 45 | /// ctor with initialisation
|
---|
| 46 | IteratedSoftDropInfo(std::vector<std::pair<double,double> > zg_thetag_in)
|
---|
| 47 | : _all_zg_thetag(zg_thetag_in){}
|
---|
| 48 |
|
---|
| 49 | /// get the raw list of (angular-ordered) zg and thetag
|
---|
| 50 | const std::vector<std::pair<double,double> > &all_zg_thetag() const{
|
---|
| 51 | return _all_zg_thetag;
|
---|
| 52 | }
|
---|
| 53 |
|
---|
| 54 | /// overloadd the () operator so that it also returns the full (zg,thetag) list
|
---|
| 55 | const std::vector<std::pair<double,double> > & operator()() const{
|
---|
| 56 | return _all_zg_thetag;
|
---|
| 57 | }
|
---|
| 58 |
|
---|
| 59 | /// overloadd the [] operator to access the ith (zg,thetag) pair
|
---|
| 60 | const std::pair<double,double> & operator[](unsigned int i) const{
|
---|
| 61 | return _all_zg_thetag[i];
|
---|
| 62 | }
|
---|
| 63 |
|
---|
| 64 | /// returns the angularity with angular exponent alpha and z
|
---|
| 65 | /// exponent kappa calculated on the zg's and thetag's found by
|
---|
| 66 | /// iterated SoftDrop
|
---|
| 67 | ///
|
---|
| 68 | /// returns 0 if no substructure was found
|
---|
| 69 | double angularity(double alpha, double kappa=1.0) const;
|
---|
| 70 |
|
---|
| 71 | /// returns the Iterated SoftDrop multiplicity
|
---|
| 72 | unsigned int multiplicity() const{ return _all_zg_thetag.size(); }
|
---|
| 73 |
|
---|
| 74 | /// returns the Iterated SoftDrop multiplicity (i.e. size)
|
---|
| 75 | unsigned int size() const{ return _all_zg_thetag.size(); }
|
---|
| 76 |
|
---|
| 77 | protected:
|
---|
| 78 | /// the real information: angular-ordered list of all the zg and
|
---|
| 79 | /// thetag that passed the (recursive) SD conddition
|
---|
| 80 | std::vector<std::pair<double,double> > _all_zg_thetag;
|
---|
| 81 | };
|
---|
| 82 |
|
---|
| 83 |
|
---|
| 84 |
|
---|
| 85 | //------------------------------------------------------------------------
|
---|
| 86 | /// \class IteratedSoftDrop
|
---|
| 87 | /// implementation of the IteratedSoftDrop procedure
|
---|
| 88 | ///
|
---|
| 89 | /// This class provides an implementation of the IteratedSoftDrop
|
---|
| 90 | /// procedure. It is based on the SoftDrop procedure can be used to
|
---|
| 91 | /// define a 'groomed symmetry factor', equal to the symmetry factor
|
---|
| 92 | /// of the two subjets of the resulting groomed jet. The Iterated
|
---|
| 93 | /// Soft Drop procedure recursively performs Soft Drop on the harder
|
---|
| 94 | /// branch of the groomed jet, halting at a specified angular cut
|
---|
| 95 | /// \f$\theta_{\rm cut}\f$, returning a list of symmetry factors which
|
---|
| 96 | /// can be used to define observables.
|
---|
| 97 | ///
|
---|
| 98 | /// Like SoftDrop, the cut applied recursively is
|
---|
| 99 | /// \f[
|
---|
| 100 | /// z > z_{\rm cut} (\theta/R_0)^\beta
|
---|
| 101 | /// \f]
|
---|
| 102 | /// with z the asymmetry measure and \f$\theta\f$ the geometrical
|
---|
| 103 | /// distance between the two subjets. The procedure halts when
|
---|
| 104 | /// \f$\theta < \theta_{\rm cut}\f$.
|
---|
| 105 | ///
|
---|
| 106 | /// By default, this implementation returs the IteratedSoftDropInfo
|
---|
| 107 | /// obtained after running IteratedSoftDrop on a jet
|
---|
| 108 | ///
|
---|
| 109 | /// Although all these quantities can be obtained from the returned
|
---|
| 110 | /// IteratedSoftDropInfo, we also provide helpers to directly get the
|
---|
| 111 | /// multiplicity, some (generalised) angularity, or the raw list of
|
---|
| 112 | /// (angular-ordered) (zg, thetag) pairs that passed the (recursive)
|
---|
| 113 | /// SoftDrop condition.
|
---|
| 114 | ///
|
---|
| 115 | /// We stress the fact that IteratedSoftDrop is _not_ a Transformer
|
---|
| 116 | /// since it returns an IteratedSoftDropInfo and not a modified
|
---|
| 117 | /// PseudoJet
|
---|
| 118 | ///
|
---|
| 119 | class IteratedSoftDrop : public FunctionOfPseudoJet<IteratedSoftDropInfo> {
|
---|
| 120 | public:
|
---|
| 121 | /// Constructor. Takes in the standard Soft Drop parameters, an angular cut \f$\theta_{\rm cut}\f$,
|
---|
| 122 | /// and a choice of angular and symmetry measure.
|
---|
| 123 | ///
|
---|
| 124 | /// \param beta the Soft Drop beta parameter
|
---|
| 125 | /// \param symmetry_cut the Soft Drop symmetry cut
|
---|
| 126 | /// \param angular_cut the angular cutoff to halt Iterated Soft Drop
|
---|
| 127 | /// \param R0 the angular distance normalization
|
---|
| 128 | /// \param subtractor an optional pointer to a pileup subtractor (ignored if zero)
|
---|
| 129 | IteratedSoftDrop(double beta, double symmetry_cut, double angular_cut, double R0 = 1.0,
|
---|
| 130 | const FunctionOfPseudoJet<PseudoJet> * subtractor = 0);
|
---|
| 131 |
|
---|
| 132 | /// Full constructor, which takes the following parameters:
|
---|
| 133 | ///
|
---|
| 134 | /// \param beta the value of the beta parameter
|
---|
| 135 | /// \param symmetry_cut the value of the cut on the symmetry measure
|
---|
| 136 | /// \param symmetry_measure the choice of measure to use to estimate the symmetry
|
---|
| 137 | /// \param angular_cut the angular cutoff to halt Iterated Soft Drop
|
---|
| 138 | /// \param R0 the angular distance normalisation [1 by default]
|
---|
| 139 | /// \param mu_cut the maximal allowed value of mass drop variable mu = m_heavy/m_parent
|
---|
| 140 | /// \param recursion_choice the strategy used to decide which subjet to recurse into
|
---|
| 141 | /// \param subtractor an optional pointer to a pileup subtractor (ignored if zero)
|
---|
| 142 | ///
|
---|
| 143 | /// Notes:
|
---|
| 144 | ///
|
---|
| 145 | /// - by default, SoftDrop will recluster the jet with the
|
---|
| 146 | /// Cambridge/Aachen algorithm if it is not already the case. This
|
---|
| 147 | /// behaviour can be changed using the "set_reclustering" method
|
---|
| 148 | /// defined below
|
---|
| 149 | ///
|
---|
| 150 | IteratedSoftDrop(double beta,
|
---|
| 151 | double symmetry_cut,
|
---|
| 152 | RecursiveSoftDrop::SymmetryMeasure symmetry_measure,
|
---|
| 153 | double angular_cut,
|
---|
| 154 | double R0 = 1.0,
|
---|
| 155 | double mu_cut = std::numeric_limits<double>::infinity(),
|
---|
| 156 | RecursiveSoftDrop::RecursionChoice recursion_choice = RecursiveSoftDrop::larger_pt,
|
---|
| 157 | const FunctionOfPseudoJet<PseudoJet> * subtractor = 0);
|
---|
| 158 |
|
---|
| 159 | /// default destructor
|
---|
| 160 | virtual ~IteratedSoftDrop(){}
|
---|
| 161 |
|
---|
| 162 | //----------------------------------------------------------------------
|
---|
| 163 | // behaviour tweaks (inherited from RecursiveSoftDrop and RecursiveSymmetryCutBase)
|
---|
| 164 |
|
---|
| 165 | /// switch to using a dynamical R0 (see RecursiveSoftDrop)
|
---|
| 166 | void set_dynamical_R0(bool value=true) { _rsd.set_dynamical_R0(value); }
|
---|
| 167 | bool use_dynamical_R0() const { return _rsd.use_dynamical_R0(); }
|
---|
| 168 |
|
---|
| 169 | /// an alternative way to set the subtractor (see RecursiveSymmetryCutBase)
|
---|
| 170 | void set_subtractor(const FunctionOfPseudoJet<PseudoJet> * subtractor_) {_rsd.set_subtractor(subtractor_);}
|
---|
| 171 | const FunctionOfPseudoJet<PseudoJet> * subtractor() const {return _rsd.subtractor();}
|
---|
| 172 |
|
---|
| 173 | /// returns the IteratedSoftDropInfo associated with the jet "jet"
|
---|
| 174 | IteratedSoftDropInfo result(const PseudoJet& jet) const;
|
---|
| 175 |
|
---|
| 176 | /// Tells the tagger whether to assume that the input jet has
|
---|
| 177 | /// already been subtracted (relevant only with a non-null
|
---|
| 178 | /// subtractor, see RecursiveSymmetryCutBase)
|
---|
| 179 | void set_input_jet_is_subtracted(bool is_subtracted) { _rsd.set_input_jet_is_subtracted(is_subtracted);}
|
---|
| 180 | bool input_jet_is_subtracted() const {return _rsd.input_jet_is_subtracted();}
|
---|
| 181 |
|
---|
| 182 | /// configure the reclustering prior to the recursive de-clustering
|
---|
| 183 | void set_reclustering(bool do_reclustering=true, const Recluster *recluster=0){
|
---|
| 184 | _rsd.set_reclustering(do_reclustering, recluster);
|
---|
| 185 | }
|
---|
| 186 |
|
---|
| 187 | //----------------------------------------------------------------------
|
---|
| 188 | // actions on jets
|
---|
| 189 | /// returns vector of ISD symmetry factors and splitting angles
|
---|
| 190 | std::vector<std::pair<double,double> > all_zg_thetag(const PseudoJet& jet) const{
|
---|
| 191 | return result(jet).all_zg_thetag();
|
---|
| 192 | }
|
---|
| 193 |
|
---|
| 194 | /// returns the angularity with angular exponent alpha and z
|
---|
| 195 | /// exponent kappa calculated on the zg's and thetag's found by
|
---|
| 196 | /// iterated SoftDrop
|
---|
| 197 | ///
|
---|
| 198 | /// returns 0 if no substructure was found
|
---|
| 199 | double angularity(const PseudoJet& jet, double alpha, double kappa=1.0) const{
|
---|
| 200 | return result(jet).angularity(alpha, kappa);
|
---|
| 201 | }
|
---|
| 202 |
|
---|
| 203 | /// returns the Iterated SoftDrop multiplicity
|
---|
| 204 | double multiplicity(const PseudoJet& jet) const{ return result(jet).multiplicity(); }
|
---|
| 205 |
|
---|
| 206 | /// description of the class
|
---|
| 207 | std::string description() const;
|
---|
| 208 |
|
---|
| 209 | protected:
|
---|
| 210 | RecursiveSoftDrop _rsd;
|
---|
| 211 | };
|
---|
| 212 |
|
---|
| 213 |
|
---|
| 214 |
|
---|
| 215 | } // namespace contrib
|
---|
| 216 |
|
---|
| 217 | FASTJET_END_NAMESPACE
|
---|
| 218 |
|
---|
| 219 | #endif // __FASTJET_CONTRIB_ITERATEDSOFTDROP_HH__
|
---|