1 | // $Id: BottomUpSoftDrop.hh 1085 2017-10-11 02:16:59Z jthaler $
|
---|
2 | //
|
---|
3 | // Copyright (c) 2017-, Gavin P. Salam, Gregory Soyez, Jesse Thaler,
|
---|
4 | // Kevin Zhou, Frederic Dreyer
|
---|
5 | //
|
---|
6 | //----------------------------------------------------------------------
|
---|
7 | // This file is part of FastJet contrib.
|
---|
8 | //
|
---|
9 | // It is free software; you can redistribute it and/or modify it under
|
---|
10 | // the terms of the GNU General Public License as published by the
|
---|
11 | // Free Software Foundation; either version 2 of the License, or (at
|
---|
12 | // your option) any later version.
|
---|
13 | //
|
---|
14 | // It is distributed in the hope that it will be useful, but WITHOUT
|
---|
15 | // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
---|
16 | // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
---|
17 | // License for more details.
|
---|
18 | //
|
---|
19 | // You should have received a copy of the GNU General Public License
|
---|
20 | // along with this code. If not, see <http://www.gnu.org/licenses/>.
|
---|
21 | //----------------------------------------------------------------------
|
---|
22 |
|
---|
23 | #ifndef __BOTTOMUPSOFTDROP_HH__
|
---|
24 | #define __BOTTOMUPSOFTDROP_HH__
|
---|
25 |
|
---|
26 | #include "fastjet/ClusterSequence.hh"
|
---|
27 | #include "fastjet/WrappedStructure.hh"
|
---|
28 | #include "fastjet/tools/Transformer.hh"
|
---|
29 |
|
---|
30 | #include <iostream>
|
---|
31 | #include <string>
|
---|
32 |
|
---|
33 | // TODO
|
---|
34 | //
|
---|
35 | // - missing class description
|
---|
36 | //
|
---|
37 | // - check what to do when pta=ptb=0
|
---|
38 | // for the moment, we recombine both for multiple reasons
|
---|
39 | // . this avois breakingteh symemtry between pa and pb
|
---|
40 | // . it would be groomed in later steps anyway
|
---|
41 | // Note that this is slightly inconsistent with our use of
|
---|
42 | // > (instead of >=) in the cdt
|
---|
43 |
|
---|
44 | FASTJET_BEGIN_NAMESPACE
|
---|
45 |
|
---|
46 | namespace contrib{
|
---|
47 |
|
---|
48 | // fwd declarations
|
---|
49 | class BottomUpSoftDrop;
|
---|
50 | class BottomUpSoftDropStructure;
|
---|
51 | class BottomUpSoftDropRecombiner;
|
---|
52 | class BottomUpSoftDropPlugin;
|
---|
53 |
|
---|
54 | //----------------------------------------------------------------------
|
---|
55 | /// \class BottomUpSoftDrop
|
---|
56 | /// Implementation of the BottomUpSoftDrop transformer
|
---|
57 | ///
|
---|
58 | /// Bottom-Up Soft drop grooms a jet by applying a modified
|
---|
59 | /// recombination scheme, where particles are recombined only if they
|
---|
60 | /// pass the Soft Drop condition
|
---|
61 | ///
|
---|
62 | /// \f[
|
---|
63 | /// z < z_{\rm cut} (\theta/R0)^\beta
|
---|
64 | /// \f]
|
---|
65 | ///
|
---|
66 | /// the groomed jet contains the particles remaining after this
|
---|
67 | /// pair-wise recombination
|
---|
68 | ///
|
---|
69 | /// Note:
|
---|
70 | /// - one can use BottomUpSoftDrop on a full event with the
|
---|
71 | /// global_grooming(event) method.
|
---|
72 | /// - if two recombined particles a and b have momentum pta=ptb=0,
|
---|
73 | /// we recombine both.
|
---|
74 | ///
|
---|
75 |
|
---|
76 |
|
---|
77 | class BottomUpSoftDrop : public Transformer {
|
---|
78 | public:
|
---|
79 | /// minimal constructor, which the jet algorithm to CA, sets the radius
|
---|
80 | /// to JetDefinition::max_allowable_R (practically equivalent to
|
---|
81 | /// infinity) and also tries to use a recombiner based on the one in
|
---|
82 | /// the jet definition of the particular jet being Soft Dropped.
|
---|
83 | ///
|
---|
84 | /// \param beta the value for beta
|
---|
85 | /// \param symmetry_cut the value for symmetry_cut
|
---|
86 | /// \param R0 the value for R0
|
---|
87 | BottomUpSoftDrop(double beta, double symmetry_cut, double R0 = 1.0)
|
---|
88 | : _jet_def(cambridge_algorithm, JetDefinition::max_allowable_R),
|
---|
89 | _beta(beta),_symmetry_cut(symmetry_cut), _R0(R0),
|
---|
90 | _get_recombiner_from_jet(true) {}
|
---|
91 |
|
---|
92 | /// alternative constructor which takes a specified jet algorithm
|
---|
93 | ///
|
---|
94 | /// \param jet_alg the jet algorithm for the internal clustering (uses R=infty)
|
---|
95 | /// \param symmetry_cut the value of symmetry_cut
|
---|
96 | /// \param beta the value for beta
|
---|
97 | /// \param R0 the value for R0
|
---|
98 | BottomUpSoftDrop(const JetAlgorithm jet_alg, double beta, double symmetry_cut,
|
---|
99 | double R0 = 1.0)
|
---|
100 | : _jet_def(jet_alg, JetDefinition::max_allowable_R),
|
---|
101 | _beta(beta), _symmetry_cut(symmetry_cut), _R0(R0),
|
---|
102 | _get_recombiner_from_jet(true) {}
|
---|
103 |
|
---|
104 |
|
---|
105 | /// alternative ctor in which the full reclustering jet definition can
|
---|
106 | /// be specified.
|
---|
107 | ///
|
---|
108 | /// \param jet_def the jet definition for the internal clustering
|
---|
109 | /// \param symmetry_cut the value of symmetry_cut
|
---|
110 | /// \param beta the value for beta
|
---|
111 | /// \param R0 the value for R0
|
---|
112 | BottomUpSoftDrop(const JetDefinition &jet_def, double beta, double symmetry_cut,
|
---|
113 | double R0 = 1.0)
|
---|
114 | : _jet_def(jet_def), _beta(beta), _symmetry_cut(symmetry_cut), _R0(R0),
|
---|
115 | _get_recombiner_from_jet(false) {}
|
---|
116 |
|
---|
117 | /// action on a single jet
|
---|
118 | virtual PseudoJet result(const PseudoJet &jet) const;
|
---|
119 |
|
---|
120 | /// global grooming on a full event
|
---|
121 | /// note: does not support jet areas
|
---|
122 | virtual std::vector<PseudoJet> global_grooming(const std::vector<PseudoJet> & event) const;
|
---|
123 |
|
---|
124 | /// description
|
---|
125 | virtual std::string description() const;
|
---|
126 |
|
---|
127 | // the type of the associated structure
|
---|
128 | typedef BottomUpSoftDropStructure StructureType;
|
---|
129 |
|
---|
130 | private:
|
---|
131 | /// check if the jet has explicit_ghosts (knowing that there is an
|
---|
132 | /// area support)
|
---|
133 | bool _check_explicit_ghosts(const PseudoJet &jet) const;
|
---|
134 |
|
---|
135 | /// see if there is a common recombiner among the pieces; if there
|
---|
136 | /// is return true and set jet_def_for_recombiner so that the
|
---|
137 | /// recombiner can be taken from that JetDefinition. Otherwise,
|
---|
138 | /// return false. 'assigned' is initially false; when true, each
|
---|
139 | /// time we meet a new jet definition, we'll check it shares the
|
---|
140 | /// same recombiner as jet_def_for_recombiner.
|
---|
141 | bool _check_common_recombiner(const PseudoJet &jet,
|
---|
142 | JetDefinition &jet_def_for_recombiner,
|
---|
143 | bool assigned=false) const;
|
---|
144 |
|
---|
145 |
|
---|
146 | JetDefinition _jet_def; ///< the internal jet definition
|
---|
147 | double _beta; ///< the value of beta
|
---|
148 | double _symmetry_cut; ///< the value of symmetry_cut
|
---|
149 | double _R0; ///< the value of R0
|
---|
150 | bool _get_recombiner_from_jet; ///< true for minimal constructor,
|
---|
151 | ///< causes recombiner to be set equal
|
---|
152 | ///< to that already used in the jet
|
---|
153 | ///< (if it can be deduced)
|
---|
154 | };
|
---|
155 |
|
---|
156 | //----------------------------------------------------------------------
|
---|
157 | /// The structure associated with a PseudoJet thas has gone through a
|
---|
158 | /// bottom/up SoftDrop transformer
|
---|
159 | class BottomUpSoftDropStructure : public WrappedStructure{
|
---|
160 | public:
|
---|
161 | /// default ctor
|
---|
162 | /// \param result_jet the jet for which we have to keep the structure
|
---|
163 | BottomUpSoftDropStructure(const PseudoJet & result_jet)
|
---|
164 | : WrappedStructure(result_jet.structure_shared_ptr()){}
|
---|
165 |
|
---|
166 | /// description
|
---|
167 | virtual std::string description() const{
|
---|
168 | return "Bottom/Up Soft Dropped PseudoJet";
|
---|
169 | }
|
---|
170 |
|
---|
171 | /// return the constituents that have been rejected
|
---|
172 | std::vector<PseudoJet> rejected() const{
|
---|
173 | return validated_cs()->childless_pseudojets();
|
---|
174 | }
|
---|
175 |
|
---|
176 | /// return the other jets that may have been found along with the
|
---|
177 | /// result of the bottom/up Soft Drop
|
---|
178 | /// The resulting vector is sorted in pt
|
---|
179 | std::vector<PseudoJet> extra_jets() const {
|
---|
180 | return sorted_by_pt((!SelectorNHardest(1))(validated_cs()->inclusive_jets()));
|
---|
181 | }
|
---|
182 |
|
---|
183 | /// return the value of beta that was used for this specific Soft Drop.
|
---|
184 | double beta() const {return _beta;}
|
---|
185 |
|
---|
186 | /// return the value of symmetry_cut that was used for this specific Soft Drop.
|
---|
187 | double symmetry_cut() const {return _symmetry_cut;}
|
---|
188 |
|
---|
189 | /// return the value of R0 that was used for this specific Soft Drop.
|
---|
190 | double R0() const {return _R0;}
|
---|
191 |
|
---|
192 | protected:
|
---|
193 | friend class BottomUpSoftDrop; ///< to allow setting the internal information
|
---|
194 |
|
---|
195 | private:
|
---|
196 | double _beta, _symmetry_cut, _R0;
|
---|
197 | };
|
---|
198 |
|
---|
199 | //----------------------------------------------------------------------
|
---|
200 | /// Class for Soft Drop recombination
|
---|
201 | /// recombines the objects that are not vetoed by Bottom-Up SoftDrop
|
---|
202 | ///
|
---|
203 | /// This recombiner only recombines, using the provided 'recombiner',
|
---|
204 | /// objects (i and j) that pass the following SoftDrop criterion:
|
---|
205 | ///
|
---|
206 | /// min(pti, ptj) > zcut (pti+ptj) (theta_ij/R0)^beta
|
---|
207 | ///
|
---|
208 | /// If the criterion fail, the hardest of i and j is kept and the
|
---|
209 | /// softest is rejected.
|
---|
210 | ///
|
---|
211 | /// Note that this in not meant for standalone use [in particular
|
---|
212 | /// because it could lead to memory issues due to the rejected indices
|
---|
213 | /// stored internally].
|
---|
214 | ///
|
---|
215 | /// This class is a direct adaptation of PruningRecombiner in Fastjet tools
|
---|
216 | class BottomUpSoftDropRecombiner : public JetDefinition::Recombiner {
|
---|
217 | public:
|
---|
218 | /// ctor
|
---|
219 | /// \param symmetry_cut value of cut on symmetry measure
|
---|
220 | /// \param beta avalue of beta parameter
|
---|
221 | /// \param recomb pointer to a recombiner to use to cluster pairs
|
---|
222 | BottomUpSoftDropRecombiner(double beta, double symmetry_cut, double R0,
|
---|
223 | const JetDefinition::Recombiner *recombiner)
|
---|
224 | : _beta(beta), _symmetry_cut(symmetry_cut), _R0sqr(R0*R0),
|
---|
225 | _recombiner(recombiner) {}
|
---|
226 |
|
---|
227 | /// perform a recombination taking into account the Soft Drop
|
---|
228 | /// conditions
|
---|
229 | virtual void recombine(const PseudoJet &pa,
|
---|
230 | const PseudoJet &pb,
|
---|
231 | PseudoJet &pab) const;
|
---|
232 |
|
---|
233 | /// returns the description of the recombiner
|
---|
234 | virtual std::string description() const {
|
---|
235 | std::ostringstream oss;
|
---|
236 | oss << "SoftDrop recombiner with symmetry_cut = " << _symmetry_cut
|
---|
237 | << ", beta = " << _beta
|
---|
238 | << ", and underlying recombiner = " << _recombiner->description();
|
---|
239 | return oss.str();
|
---|
240 | }
|
---|
241 |
|
---|
242 | /// return the history indices that have been soft dropped away
|
---|
243 | const std::vector<unsigned int> & rejected() const{ return _rejected;}
|
---|
244 |
|
---|
245 | /// clears the list of rejected indices
|
---|
246 | ///
|
---|
247 | /// If one decides to use this recombiner standalone, one has to
|
---|
248 | /// call this after each clustering in order for the rejected() vector
|
---|
249 | /// to remain sensible and not grow to infinite size.
|
---|
250 | void clear_rejected(){ _rejected.clear();}
|
---|
251 |
|
---|
252 | private:
|
---|
253 | double _beta; ///< beta parameter
|
---|
254 | double _symmetry_cut; ///< value of symmetry_cut
|
---|
255 | double _R0sqr; ///< normalisation of the angular distance
|
---|
256 | const JetDefinition::Recombiner *_recombiner; ///< the underlying recombiner to use
|
---|
257 | mutable std::vector<unsigned int> _rejected; ///< list of rejected history indices
|
---|
258 | };
|
---|
259 |
|
---|
260 | //----------------------------------------------------------------------
|
---|
261 | /// \class BottomUpSoftDropPlugin
|
---|
262 | /// Class for a bottom/up Soft Drop algorithm, based on the Pruner plugin
|
---|
263 | ///
|
---|
264 | /// This is an internal plugin that clusters the particles using the
|
---|
265 | /// BottomUpRecombiner.
|
---|
266 | ///
|
---|
267 | /// See BottomUpRecombiner for a description of what bottom-up
|
---|
268 | /// SoftDrop does.
|
---|
269 | ///
|
---|
270 | /// Note that this is an internal class used by the BottomUpSoftDrop
|
---|
271 | /// transformer and it is not meant to be used as a standalone
|
---|
272 | /// clustering tool.
|
---|
273 | class BottomUpSoftDropPlugin : public JetDefinition::Plugin {
|
---|
274 | public:
|
---|
275 | /// ctor
|
---|
276 | /// \param jet_def the jet definition to be used for the
|
---|
277 | /// internal clustering
|
---|
278 | /// \param symmetry_cut value of cut on symmetry measure
|
---|
279 | /// \param beta value of beta parameter
|
---|
280 | BottomUpSoftDropPlugin(const JetDefinition &jet_def, double beta, double symmetry_cut,
|
---|
281 | double R0 = 1.0)
|
---|
282 | : _jet_def(jet_def), _beta(beta), _symmetry_cut(symmetry_cut), _R0(R0) {}
|
---|
283 |
|
---|
284 | /// the actual clustering work for the plugin
|
---|
285 | virtual void run_clustering(ClusterSequence &input_cs) const;
|
---|
286 |
|
---|
287 | /// description of the plugin
|
---|
288 | virtual std::string description() const;
|
---|
289 |
|
---|
290 | /// returns the radius
|
---|
291 | virtual double R() const {return _jet_def.R();}
|
---|
292 |
|
---|
293 | private:
|
---|
294 | JetDefinition _jet_def; ///< the internal jet definition
|
---|
295 | double _beta; ///< beta parameter
|
---|
296 | double _symmetry_cut; ///< value of symmetry_cut
|
---|
297 | double _R0; ///< normalisation of the angular distance
|
---|
298 | };
|
---|
299 |
|
---|
300 | }
|
---|
301 |
|
---|
302 | FASTJET_END_NAMESPACE // defined in fastjet/internal/base.hh
|
---|
303 | #endif // __BOTTOMUPSOFTDROP_HH__
|
---|