1 | #ifndef __SISCONEPLUGIN_HH__
|
---|
2 | #define __SISCONEPLUGIN_HH__
|
---|
3 |
|
---|
4 | #include "Utilities/Fastjet/include/fastjet/JetDefinition.hh"
|
---|
5 | #include "Utilities/Fastjet/include/fastjet/ClusterSequence.hh" // needed for the extras we define
|
---|
6 | #include <vector>
|
---|
7 | #include <memory>
|
---|
8 | #include <cmath>
|
---|
9 |
|
---|
10 | // put a forward declaration to the Csiscone class to avoid having to
|
---|
11 | // include the siscone headers here
|
---|
12 | namespace siscone {
|
---|
13 | class Csiscone;
|
---|
14 | }
|
---|
15 |
|
---|
16 | // questionable whether this should be in fastjet namespace or not...
|
---|
17 | FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh
|
---|
18 |
|
---|
19 | // another forward declaration to reduce includes
|
---|
20 | class PseudoJet;
|
---|
21 |
|
---|
22 | //----------------------------------------------------------------------
|
---|
23 | //
|
---|
24 | /// SISConePlugin is a plugin for fastjet (v2.1 upwards) that provides
|
---|
25 | /// an interface to the seedless infrared safe cone jet finder by
|
---|
26 | /// Gregory Soyez and Gavin Salam.
|
---|
27 | ///
|
---|
28 | /// As of 2006-12-26, this plugin is beta, as is the SISCone code
|
---|
29 | /// itself.
|
---|
30 | ///
|
---|
31 | /// SISCone uses geometrical techniques to exhaustively consider all
|
---|
32 | /// possible distinct cones. It then finds out which ones are stable
|
---|
33 | /// and sends the result to the Tevatron Run-II type split-merge
|
---|
34 | /// procedure for overlapping cones.
|
---|
35 | ///
|
---|
36 | /// Four parameters govern the "physics" of the algorithm:
|
---|
37 | ///
|
---|
38 | /// - the cone_radius (this should be self-explanatory!)
|
---|
39 | ///
|
---|
40 | /// - the overlap_threshold is the parameter which dictates how much
|
---|
41 | /// two jets must overlap (pt_overlap/min(pt1,pt2)) if they are to be
|
---|
42 | /// merged
|
---|
43 | ///
|
---|
44 | /// - Not all particles are in stable cones in the first round of
|
---|
45 | /// searching for stable cones; one can therefore optionally have the
|
---|
46 | /// the jet finder carry out additional passes of searching for
|
---|
47 | /// stable cones among particles that were in no stable cone in
|
---|
48 | /// previous passes --- the maximum number of passes carried out is
|
---|
49 | /// n_pass_max. If this is zero then additional passes are carried
|
---|
50 | /// out until no new stable cones are found.
|
---|
51 | ///
|
---|
52 | /// - Protojet ptmin: protojets that are below this ptmin
|
---|
53 | /// (default = 0) are discarded before each iteration of the
|
---|
54 | /// split-merge loop.
|
---|
55 | ///
|
---|
56 | /// One parameter governs some internal algorithmic shortcuts:
|
---|
57 | ///
|
---|
58 | /// - if "caching" is turned on then the last event clustered by
|
---|
59 | /// siscone is stored -- if the current event is identical and the
|
---|
60 | /// cone_radius and n_pass_mass are identical, then the only part of
|
---|
61 | /// the clustering that needs to be rerun is the split-merge part,
|
---|
62 | /// leading to significant speed gains; there is a small (O(N) storage
|
---|
63 | /// and speed) penalty for caching, so it should be kept off
|
---|
64 | /// (default) if only a single overlap_threshold is used.
|
---|
65 | ///
|
---|
66 | /// The final jets can be accessed by requestion the
|
---|
67 | /// inclusive_jets(...) from the ClusterSequence object. Note that
|
---|
68 | /// these PseudoJets have their user_index() set to the index of the
|
---|
69 | /// pass in which they were found (first pass = 0). NB: This does not
|
---|
70 | /// currently work for jets that consist of a single particle.
|
---|
71 | ///
|
---|
72 | /// For further information on the details of the algorithm see the
|
---|
73 | /// SISCone paper; for documentation about the implementation, see the
|
---|
74 | /// siscone/doc/html/index.html file.
|
---|
75 | //
|
---|
76 | class SISConePlugin : public JetDefinition::Plugin {
|
---|
77 | public:
|
---|
78 |
|
---|
79 | /// enum for the different split-merge scale choices;
|
---|
80 | /// Note that order _must_ be the same as in siscone
|
---|
81 | enum SplitMergeScale {SM_pt, ///< transverse momentum (E-scheme), IR unsafe
|
---|
82 | SM_Et, ///< transverse energy (E-scheme), not long. boost invariant
|
---|
83 | ///< original run-II choice [may not be implemented]
|
---|
84 | SM_mt, ///< transverse mass (E-scheme), IR safe except
|
---|
85 | ///< in decays of two identical narrow heavy particles
|
---|
86 | SM_pttilde ///< pt-scheme pt = \sum_{i in jet} |p_{ti}|, should
|
---|
87 | ///< be IR safe in all cases
|
---|
88 | };
|
---|
89 |
|
---|
90 |
|
---|
91 | /// Constructor for the SISCone Plugin class.
|
---|
92 | ///
|
---|
93 | /// Note: though the default value here for the overlap_threshold is
|
---|
94 | /// 0.5 (for backwards compatibility), there is a strong
|
---|
95 | /// recommendation to use a higher value, e.g. 0.75, especially in
|
---|
96 | /// environments with a substantial amount of underlying event or
|
---|
97 | /// pileup.
|
---|
98 | SISConePlugin (double cone_radius,
|
---|
99 | double overlap_threshold = 0.5,
|
---|
100 | int n_pass_max = 0,
|
---|
101 | double protojet_ptmin = 0.0,
|
---|
102 | bool caching = false,
|
---|
103 | SplitMergeScale split_merge_scale = SM_pttilde,
|
---|
104 | double split_merge_stopping_scale = 0.0) :
|
---|
105 | _cone_radius (cone_radius ),
|
---|
106 | _overlap_threshold (overlap_threshold ),
|
---|
107 | _n_pass_max (n_pass_max ),
|
---|
108 | _protojet_ptmin (protojet_ptmin),
|
---|
109 | _caching (caching),
|
---|
110 | _split_merge_scale (split_merge_scale),
|
---|
111 | _split_merge_stopping_scale (split_merge_stopping_scale),
|
---|
112 | _ghost_sep_scale (0.0) {}
|
---|
113 |
|
---|
114 | /// Backwards compatible constructor for the SISCone Plugin class
|
---|
115 | SISConePlugin (double cone_radius,
|
---|
116 | double overlap_threshold,
|
---|
117 | int n_pass_max,
|
---|
118 | double protojet_ptmin,
|
---|
119 | bool caching ,
|
---|
120 | bool split_merge_on_transverse_mass) :
|
---|
121 | _cone_radius (cone_radius ),
|
---|
122 | _overlap_threshold (overlap_threshold ),
|
---|
123 | _n_pass_max (n_pass_max ),
|
---|
124 | _protojet_ptmin (protojet_ptmin),
|
---|
125 | _caching (caching),
|
---|
126 | _split_merge_scale (split_merge_on_transverse_mass ? SM_mt : SM_pttilde),
|
---|
127 | _ghost_sep_scale (0.0) {}
|
---|
128 |
|
---|
129 | /// backwards compatible constructor for the SISCone Plugin class
|
---|
130 | /// (avoid using this in future).
|
---|
131 | SISConePlugin (double cone_radius,
|
---|
132 | double overlap_threshold,
|
---|
133 | int n_pass_max,
|
---|
134 | bool caching ) :
|
---|
135 | _cone_radius (cone_radius ),
|
---|
136 | _overlap_threshold (overlap_threshold ),
|
---|
137 | _n_pass_max (n_pass_max ),
|
---|
138 | _protojet_ptmin (0.0),
|
---|
139 | _caching (caching),
|
---|
140 | _split_merge_scale (SM_mt),
|
---|
141 | _ghost_sep_scale (0.0) {}
|
---|
142 |
|
---|
143 | /// copy constructor
|
---|
144 | SISConePlugin (const SISConePlugin & plugin) {
|
---|
145 | *this = plugin;
|
---|
146 | }
|
---|
147 |
|
---|
148 | /// the cone radius
|
---|
149 | double cone_radius () const {return _cone_radius ;}
|
---|
150 |
|
---|
151 | /// Fraction of overlap energy in a jet above which jets are merged
|
---|
152 | /// and below which jets are split.
|
---|
153 | double overlap_threshold () const {return _overlap_threshold ;}
|
---|
154 |
|
---|
155 | /// the maximum number of passes of stable-cone searching (<=0 is same
|
---|
156 | /// as infinity).
|
---|
157 | int n_pass_max () const {return _n_pass_max ;}
|
---|
158 |
|
---|
159 | /// minimum pt for a protojet to be considered in the split-merge step
|
---|
160 | /// of the algorithm
|
---|
161 | double protojet_ptmin () const {return _protojet_ptmin ;}
|
---|
162 |
|
---|
163 | /// return the scale to be passed to SISCone as the protojet_ptmin
|
---|
164 | /// -- if we have a ghost separation scale that is above the
|
---|
165 | /// protojet_ptmin, then the ghost_separation_scale becomes the
|
---|
166 | /// relevant one to use here
|
---|
167 | double protojet_or_ghost_ptmin () const {return std::max(_protojet_ptmin,
|
---|
168 | _ghost_sep_scale);}
|
---|
169 |
|
---|
170 | /// indicates scale used in split-merge
|
---|
171 | SplitMergeScale split_merge_scale() const {return _split_merge_scale;}
|
---|
172 | /// sets scale used in split-merge
|
---|
173 | void set_split_merge_scale(SplitMergeScale sms) {_split_merge_scale = sms;}
|
---|
174 |
|
---|
175 | /// indicates whether the split-merge orders on transverse mass or not.
|
---|
176 | /// retained for backwards compatibility with 2.1.0b3
|
---|
177 | bool split_merge_on_transverse_mass() const {return _split_merge_scale == SM_mt ;}
|
---|
178 | void set_split_merge_on_transverse_mass(bool val) {
|
---|
179 | _split_merge_scale = val ? SM_mt : SM_pt;}
|
---|
180 |
|
---|
181 | /// set the "split_merge_stopping_scale": if the scale variable for
|
---|
182 | /// all protojets is below this, then stop the split-merge procedure
|
---|
183 | /// and keep only those jets found so far. This is useful in
|
---|
184 | /// determination of areas of hard jets because it can be used to
|
---|
185 | /// avoid running the split-merging on the pure ghost-part of the
|
---|
186 | /// event.
|
---|
187 | void set_split_merge_stopping_scale(double scale) {
|
---|
188 | _split_merge_stopping_scale = scale;}
|
---|
189 |
|
---|
190 | /// return the value of the split_merge_stopping_scale (see
|
---|
191 | /// set_split_merge_stopping_scale(...) for description)
|
---|
192 | double split_merge_stopping_scale() {return _split_merge_stopping_scale;}
|
---|
193 |
|
---|
194 | /// indicates whether caching is turned on or not.
|
---|
195 | bool caching() const {return _caching ;}
|
---|
196 |
|
---|
197 | // the things that are required by base class
|
---|
198 | virtual std::string description () const;
|
---|
199 | virtual void run_clustering(ClusterSequence &) const;
|
---|
200 | /// the plugin mechanism's standard way of accessing the jet radius
|
---|
201 | virtual double R() const {return cone_radius();}
|
---|
202 |
|
---|
203 | /// return true since there is specific support for the measurement
|
---|
204 | /// of passive areas, in the sense that areas determined from all
|
---|
205 | /// particles below the ghost separation scale will be a passive
|
---|
206 | /// area.
|
---|
207 | virtual bool supports_ghosted_passive_areas() const {return true;}
|
---|
208 |
|
---|
209 | /// set the ghost separation scale for passive area determinations
|
---|
210 | /// _just_ in the next run (strictly speaking that makes the routine
|
---|
211 | /// a non const, so related internal info must be stored as a mutable)
|
---|
212 | virtual void set_ghost_separation_scale(double scale) const {
|
---|
213 | _ghost_sep_scale = scale;
|
---|
214 | }
|
---|
215 |
|
---|
216 | virtual double ghost_separation_scale() const {return _ghost_sep_scale;}
|
---|
217 |
|
---|
218 | private:
|
---|
219 | double _cone_radius, _overlap_threshold;
|
---|
220 | int _n_pass_max;
|
---|
221 | double _protojet_ptmin;
|
---|
222 | bool _caching;//, _split_merge_on_transverse_mass;
|
---|
223 | SplitMergeScale _split_merge_scale;
|
---|
224 | double _split_merge_stopping_scale;
|
---|
225 |
|
---|
226 | mutable double _ghost_sep_scale;
|
---|
227 |
|
---|
228 | // variables for caching the results and the input
|
---|
229 | static std::auto_ptr<SISConePlugin > stored_plugin;
|
---|
230 | static std::auto_ptr<std::vector<PseudoJet> > stored_particles;
|
---|
231 | static std::auto_ptr<siscone::Csiscone > stored_siscone;
|
---|
232 |
|
---|
233 | };
|
---|
234 |
|
---|
235 |
|
---|
236 | //======================================================================
|
---|
237 | /// Class that provides extra information about a SISCone clustering
|
---|
238 | class SISConeExtras : public ClusterSequence::Extras {
|
---|
239 | public:
|
---|
240 | /// returns a reference to the vector of stable cones (aka protocones)
|
---|
241 | const std::vector<PseudoJet> & stable_cones() const {return _protocones;}
|
---|
242 |
|
---|
243 | /// an old name for getting the vector of stable cones (aka protocones)
|
---|
244 | const std::vector<PseudoJet> & protocones() const {return _protocones;}
|
---|
245 |
|
---|
246 |
|
---|
247 | /// access to the siscone jet def plugin (more convenient than
|
---|
248 | /// getting it from the original jet definition, because here it's
|
---|
249 | /// directly of the right type (rather than the base type)
|
---|
250 | const SISConePlugin * jet_def_plugin() const {return _jet_def_plugin;}
|
---|
251 |
|
---|
252 | /// return a brief summary of the contents of the extras object
|
---|
253 | /// (specifically, the number of protocones.
|
---|
254 | std::string description() const;
|
---|
255 |
|
---|
256 | /// return the smallest difference in squared distance encountered
|
---|
257 | /// during splitting between a particle and two overlapping
|
---|
258 | /// protojets.
|
---|
259 | inline double most_ambiguous_split() const {return _most_ambiguous_split;}
|
---|
260 |
|
---|
261 | private:
|
---|
262 | std::vector<PseudoJet> _protocones;
|
---|
263 | const SISConePlugin * _jet_def_plugin;
|
---|
264 | double _most_ambiguous_split;
|
---|
265 | // let us be written to by SISConePlugin
|
---|
266 | friend class SISConePlugin;
|
---|
267 | };
|
---|
268 |
|
---|
269 |
|
---|
270 | FASTJET_END_NAMESPACE // defined in fastjet/internal/base.hh
|
---|
271 |
|
---|
272 | #endif // __SISCONEPLUGIN_HH__
|
---|
273 |
|
---|