FastJet 3.4.1
Recluster.hh
1#ifndef __FASTJET_TOOLS_RECLUSTER_HH__
2#define __FASTJET_TOOLS_RECLUSTER_HH__
3
4// $Id$
5//
6// Copyright (c) 2014, Matteo Cacciari, Gavin P. Salam and Gregory Soyez
7//
8//----------------------------------------------------------------------
9// This file is part of FastJet
10//
11// It is free software; you can redistribute it and/or modify it under
12// the terms of the GNU General Public License as published by the
13// Free Software Foundation; either version 2 of the License, or (at
14// your option) any later version.
15//
16// It is distributed in the hope that it will be useful, but WITHOUT
17// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
19// License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this code. If not, see <http://www.gnu.org/licenses/>.
23//----------------------------------------------------------------------
24
25#include "fastjet/JetDefinition.hh"
26#include "fastjet/FunctionOfPseudoJet.hh" // to derive Recluster from FOfPJ<PJ>
27#include <iostream>
28#include <string>
29
30// TODO:
31//
32// - maintain Voronoi areas? Requires CSAB:has_voronoi_area() {->UNASSIGNED}
33// - make sure the description of the class is OK
34
35
36
37FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh
38
39//----------------------------------------------------------------------
40/// @ingroup tools_generic
41/// \class Recluster
42/// Recluster a jet's constituents with a new jet definition.
43///
44/// When Recluster is constructed from a JetDefinition, it is that
45/// definition that will be used to obtain the new jets. The user may
46/// then decide if the recombiner should be the one from that jet
47/// definition or if it should be acquired from the jet being
48/// processed (the default).
49///
50/// Alternatively, Recluster can be constructed from a jet algorithm
51/// and an optional radius. In that case the recombiner is
52/// systematically obtained from the jet being processed (unless you
53/// call set_acquire_recombiner(false)). If only the jet algorithm is
54/// specified, a default radius of max_allowable_R will be assumed if
55/// needed.
56///
57/// Recluster has two possible behaviours:
58///
59/// - if it is constructed with keep=keep_only_hardest the hardest
60/// inclusive jet is returned as a "standard" jet with an
61/// associated cluster sequence (unless there were no inclusive
62/// jets, in which case a zero jet is returned, with no associated
63/// cluster sequence)
64///
65/// - if it is constructed with keep=keep_all
66/// all the inclusive jets are joined into a composite jet
67///
68/// [Note that since the structure of the resulting PseudoJet depends
69/// on its usage, this class inherits from
70/// FunctionOfPseudoJet<PseudoJet> (including a description) rather
71/// than being a full-fledged Transformer]
72///
73class Recluster : public FunctionOfPseudoJet<PseudoJet> {
74public:
75 /// the various options for the output of Recluster
76 enum Keep{
77 /// keep only the hardest inclusive jet and return a "standard" jet with
78 /// an associated ClusterSequence [this will be the default]
80 /// keep all the inclusive jets. result() will join them into a composite
81 /// jet
82 keep_all
83 };
84
85 /// default constructor (uses an undefined JetDefinition, and so cannot
86 /// be used directly).
87 Recluster() : _new_jet_def(), _acquire_recombiner(true),
88 _keep(keep_only_hardest), _cambridge_optimisation_enabled(true){}
89
90 /// Constructs a Recluster object that reclusters a jet into a new jet
91 /// using a generic JetDefinition
92 ///
93 /// \param new_jet_def the jet definition applied to do the reclustering
94 /// \param acquire_recombiner
95 /// when true, the reclustering will guess the
96 /// recombiner from the input jet instead of
97 /// the one in new_jet_def. An error is then
98 /// thrown if no consistent recombiner is found
99 /// \param keep_in Recluster::keep_only_hardest: the result is
100 /// the hardest inclusive jet after reclustering,
101 /// returned as a "standard" jet.
102 /// Recluster::keep_all: the result is a
103 /// composite jet with the inclusive jets as pieces.
104 Recluster(const JetDefinition & new_jet_def,
105 bool acquire_recombiner_in = false,
106 Keep keep_in = keep_only_hardest)
107 : _new_jet_def(new_jet_def), _acquire_recombiner(acquire_recombiner_in),
108 _keep(keep_in), _cambridge_optimisation_enabled(true) {}
109
110 /// Constructs a Recluster object that reclusters a jet into a new jet
111 /// using a JetAlgorithm and its parameters
112 ///
113 /// \param new_jet_alg the jet algorithm applied to obtain the new clustering
114 /// \param new_jet_radius the jet radius
115 /// \param keep_in Recluster::keep_only_hardest: the result is
116 /// the hardest inclusive jet after reclustering,
117 /// returned as a "standard" jet.
118 /// Recluster::keep_all: the result is a
119 /// composite jet with the inclusive jets as pieces.
120 ///
121 /// This ctor will always acquire the recombiner from the jet being
122 /// reclustered (it will throw if none can be found). If you wish
123 /// to use Recluster with an algorithm that requires an extra
124 /// parameter (like the genkt algorithm), please specify the jet
125 /// definition fully using the constructor above.
126 Recluster(JetAlgorithm new_jet_alg, double new_jet_radius, Keep keep_in = keep_only_hardest);
127
128 /// constructor with just a jet algorithm, but no jet radius. If the
129 /// algorithm requires a jet radius, JetDefinition::max_allowable_R will be used.
130 ///
131 Recluster(JetAlgorithm new_jet_alg, Keep keep_in = keep_only_hardest);
132
133 /// default dtor
134 virtual ~Recluster(){}
135
136 //----------------------------------------------------------------------
137 // tweaking the behaviour and corresponding enquiry functions
138
139 /// set whether the reclustering should attempt to acquire a
140 /// recombiner from the input jet
141 void set_acquire_recombiner(bool acquire) {_acquire_recombiner = acquire;}
142
143 /// returns true if this reclusterer is set to acquire the
144 /// recombiner from the input jet
145 bool acquire_recombiner() const{ return _acquire_recombiner;}
146
147
148 /// sets whether to try to optimise reclustering with
149 /// Cambridge/Aachen algorithms (by not reclustering if the
150 /// requested C/A reclustering can be obtained by using subjets of
151 /// an input C/A jet or one composed of multiple C/A pieces from the
152 /// same clustering sequence). By default this is enabled, and
153 /// _should_ always be correct; disable it to test this statement!
154 void set_cambridge_optimisation(bool enabled){ _cambridge_optimisation_enabled = enabled;}
155 /// sets whether to try to optimise reclustering with Cambridge/Aachen algorithms (US spelling!)
156 void set_cambridge_optimization(bool enabled){ _cambridge_optimisation_enabled = enabled;}
157
158 /// returns true if the reclusterer tries to optimise reclustering
159 /// with Cambridge/Aachen algorithms
160 bool cambridge_optimization(){return _cambridge_optimisation_enabled;}
161 bool cambridge_optimisation(){return _cambridge_optimisation_enabled;}
162
163 /// set the behaviour with regards to keeping all resulting jets or
164 /// just the hardest.
165 void set_keep(Keep keep_in) {_keep = keep_in;}
166
167 /// returns the current "keep" mode i.e. whether only the hardest
168 /// inclusive jet is returned or all of them (see the Keep enum above)
169 Keep keep() const{ return _keep;}
170
171
172 //----------------------------------------------------------------------
173 // retrieving info about the behaviour
174
175 /// class description
176 virtual std::string description() const;
177
178
179 //----------------------------------------------------------------------
180 // core action of ths class
181
182 /// runs the reclustering and sets kept and rejected to be the jets
183 /// of interest (with non-zero rho, they will have been
184 /// subtracted). Normally this will be accessed through the base
185 /// class's operator().
186 ///
187 /// \param jet the jet that gets reclustered
188 /// \return the reclustered jet
189 virtual PseudoJet result(const PseudoJet & jet) const;
190
191 /// A lower-level method that does the actual work of reclustering
192 /// the input jet. The resulting jets are stored in output_jets.
193 /// The jet definition that has been used can be accessed from the
194 /// output_jets' ClusterSequence.
195 ///
196 /// \param input_jet the (input) jet that one wants to recluster
197 /// \param output_jets inclusive jets resulting from the new clustering
198 ///
199 /// Returns true if the C/A optimisation has been used (this means
200 /// that generate_output_jet then has to watch out for non-explicit-ghost
201 /// areas that might be leftover)
202 bool get_new_jets_and_def(const PseudoJet & input_jet,
203 std::vector<PseudoJet> & output_jets) const;
204
205 /// given a set of inclusive jets and a jet definition used, create the
206 /// resulting PseudoJet;
207 ///
208 /// If ca_optimisation_used then special care will be taken in
209 /// deciding whether the final jet can legitimately have an area.
210 PseudoJet generate_output_jet(std::vector<PseudoJet> & incljets,
211 bool ca_optimisation_used) const;
212
213
214private:
215 /// set the reclustered elements in the simple case of C/A+C/A
216 void _recluster_ca(const std::vector<PseudoJet> & all_pieces,
217 std::vector<PseudoJet> & incljets,
218 double Rfilt) const;
219
220 /// set the reclustered elements in the generic re-clustering case
221 void _recluster_generic(const PseudoJet & jet,
222 std::vector<PseudoJet> & incljets,
223 const JetDefinition & new_jet_def,
224 bool do_areas) const;
225
226 // a series of checks
227 //--------------------------------------------------------------------
228 /// get the pieces down to the fundamental pieces
229 bool _get_all_pieces(const PseudoJet &jet, std::vector<PseudoJet> &all_pieces) const;
230
231 /// associate the proper recombiner taken from the underlying pieces
232 /// (an error is thrown if the pieces do no share a common
233 /// recombiner)
234 void _acquire_recombiner_from_pieces(const std::vector<PseudoJet> &all_pieces,
235 JetDefinition &new_jet_def) const;
236
237 /// check if one can apply the simplified trick for C/A subjets
238 bool _check_ca(const std::vector<PseudoJet> &all_pieces,
239 const JetDefinition &new_jet_def) const;
240
241 /// check if the jet (or all its pieces) have explicit ghosts
242 /// (assuming the jet has area support
243 ///
244 /// Note that if the jet has an associated cluster sequence that is no
245 /// longer valid, an error will be thrown
246 bool _check_explicit_ghosts(const std::vector<PseudoJet> &all_pieces) const;
247
248 JetDefinition _new_jet_def; ///< the jet definition to use to extract the jets
249 bool _acquire_recombiner; ///< get the recombiner from the input
250 ///< jet rather than from _new_jet_def
251 Keep _keep; ///< dictates which inclusive jets are kept and
252 ///< which are returned (see Keep above)
253
254 bool _cambridge_optimisation_enabled; ///<enable the checks to
255 ///< perform optimisation when
256 ///< C/A reclustering is asked
257
258 static LimitedWarning _explicit_ghost_warning;
259};
260
261FASTJET_END_NAMESPACE // defined in fastjet/internal/base.hh
262
263#endif // __FASTJET_TOOLS_RECLUSTER_HH__
base class providing interface for a generic function of a PseudoJet
class that is intended to hold a full definition of the jet clusterer
class to provide facilities for giving warnings up to some maximum number of times and to provide glo...
Class to contain pseudojets, including minimal information of use to jet-clustering routines.
Definition: PseudoJet.hh:68
Recluster a jet's constituents with a new jet definition.
Definition: Recluster.hh:73
bool cambridge_optimization()
returns true if the reclusterer tries to optimise reclustering with Cambridge/Aachen algorithms
Definition: Recluster.hh:160
Keep keep() const
returns the current "keep" mode i.e.
Definition: Recluster.hh:169
Keep
the various options for the output of Recluster
Definition: Recluster.hh:76
@ keep_only_hardest
keep only the hardest inclusive jet and return a "standard" jet with an associated ClusterSequence [t...
Definition: Recluster.hh:79
virtual ~Recluster()
default dtor
Definition: Recluster.hh:134
Recluster(const JetDefinition &new_jet_def, bool acquire_recombiner_in=false, Keep keep_in=keep_only_hardest)
Constructs a Recluster object that reclusters a jet into a new jet using a generic JetDefinition.
Definition: Recluster.hh:104
void set_acquire_recombiner(bool acquire)
set whether the reclustering should attempt to acquire a recombiner from the input jet
Definition: Recluster.hh:141
void set_keep(Keep keep_in)
set the behaviour with regards to keeping all resulting jets or just the hardest.
Definition: Recluster.hh:165
void set_cambridge_optimisation(bool enabled)
sets whether to try to optimise reclustering with Cambridge/Aachen algorithms (by not reclustering if...
Definition: Recluster.hh:154
Recluster()
default constructor (uses an undefined JetDefinition, and so cannot be used directly).
Definition: Recluster.hh:87
bool acquire_recombiner() const
returns true if this reclusterer is set to acquire the recombiner from the input jet
Definition: Recluster.hh:145
void set_cambridge_optimization(bool enabled)
sets whether to try to optimise reclustering with Cambridge/Aachen algorithms (US spelling!...
Definition: Recluster.hh:156
JetAlgorithm
the various families of jet-clustering algorithm