Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:57:19

0001 #ifndef __SISCONESPHERICALPLUGIN_HH__
0002 #define __SISCONESPHERICALPLUGIN_HH__
0003 
0004 #include "SISConeBasePlugin.hh"
0005 
0006 // forward declaration of the siscone classes we'll need
0007 namespace siscone_spherical{
0008   class CSphsiscone;
0009 }
0010 
0011 // questionable whether this should be in fastjet namespace or not...
0012 FASTJET_BEGIN_NAMESPACE      // defined in fastjet/internal/base.hh
0013 
0014 //----------------------------------------------------------------------
0015 //
0016 /// @ingroup plugins
0017 /// \class SISConeSphericalPlugin
0018 /// Implementation of the spherical version of the SISCone algorithm
0019 /// (plugin for fastjet v2.1 upwards)
0020 ///
0021 /// SISConeSphericalPlugin is a plugin for fastjet (v2.1 upwards) that
0022 /// provides an interface to the seedless infrared safe cone jet
0023 /// finder by Gregory Soyez and Gavin Salam.
0024 ///
0025 /// This is the version of SISCone using spherical coordinates. Compared
0026 /// to the original cylindrical version:
0027 ///
0028 ///  - Particles are within a cone if their opening angle relative to the
0029 ///    centre of the cone is less than R
0030 ///
0031 ///  - The split-merge step uses the total energy in the protojet as the
0032 ///    ordering and overlap-measure variable
0033 ///
0034 ///  - The IR safety of the split-merge step is _not_ guaranteed for
0035 ///    events consisting of two back-to-back identical heavy particles
0036 ///    that decay. This is because of potential degeneracies in the
0037 ///    ordering for the split-merge step. 
0038 ///
0039 ///    For moderate values of R the problem should not be too severe
0040 ///    (or may even be absent for some values of the overlap
0041 ///    parameter), however the user should be aware of the issue.
0042 ///
0043 ///    The default split-merge scale may change at a later date to
0044 ///    resolve this issue.
0045 ///
0046 ///
0047 /// SISCone uses geometrical techniques to exhaustively consider all
0048 /// possible distinct cones. It then finds out which ones are stable
0049 /// and sends the result to the Tevatron Run-II type split-merge
0050 /// procedure for overlapping cones.
0051 ///
0052 /// Four parameters govern the "physics" of the algorithm:
0053 ///
0054 ///  - the cone_radius (this should be self-explanatory!)
0055 ///
0056 ///  - the overlap_threshold is the parameter which dictates how much
0057 ///    two jets must overlap (E_overlap/min(E1,E2)) if they are to be 
0058 ///    merged
0059 ///
0060 ///  - Not all particles are in stable cones in the first round of
0061 ///    searching for stable cones; one can therefore optionally have the
0062 ///    the jet finder carry out additional passes of searching for
0063 ///    stable cones among particles that were in no stable cone in
0064 ///    previous passes --- the maximum number of passes carried out is
0065 ///    n_pass_max. If this is zero then additional passes are carried
0066 ///    out until no new stable cones are found.
0067 ///
0068 ///  - Protojet Emin: protojets that are below this Emin
0069 ///    (default = 0) are discarded before each iteration of the
0070 ///    split-merge loop.
0071 ///
0072 /// One parameter governs some internal algorithmic shortcuts: 
0073 ///
0074 /// - if "caching" is turned on then the last event clustered by
0075 ///   siscone is stored -- if the current event is identical and the
0076 ///   cone_radius and n_pass_max are identical, then the only part of
0077 ///   the clustering that needs to be rerun is the split-merge part,
0078 ///   leading to significant speed gains; there is a small (O(N) storage
0079 ///   and speed) penalty for caching, so it should be kept off
0080 ///   (default) if only a single overlap_threshold is used.
0081 ///
0082 /// The final jets can be accessed by requestion the
0083 /// inclusive_jets(...) from the ClusterSequence object. Note that
0084 /// these PseudoJets have their user_index() set to the index of the
0085 /// pass in which they were found (first pass = 0). NB: This does not
0086 /// currently work for jets that consist of a single particle.
0087 ///
0088 /// For further information on the details of the algorithm see the
0089 /// SISCone paper, arXiv:0704.0292 [JHEP 0705:086,2007].
0090 ///
0091 /// For documentation about the implementation, see the
0092 /// siscone/doc/html/index.html file.
0093 //
0094 class SISConeSphericalPlugin : public SISConeBasePlugin{
0095 public:
0096 
0097   /// enum for the different split-merge scale choices;
0098   /// Note that order _must_ be the same as in siscone
0099   enum SplitMergeScale {SM_E,        ///< Energy (IR unsafe with momentum conservation)
0100             SM_Etilde    ///< sum_{i \in jet} E_i [1+sin^2(theta_iJ)]
0101   };
0102 
0103 
0104   /// Main constructor for the SISConeSpherical Plugin class.  
0105   ///
0106   ///
0107   SISConeSphericalPlugin (double cone_radius_in,
0108               double overlap_threshold_in,
0109               int    n_pass_max_in = 0,
0110               double protojet_Emin_in = 0.0, 
0111               bool   caching_in = false,
0112               SplitMergeScale  split_merge_scale_in = SM_Etilde,
0113               double split_merge_stopping_scale_in = 0.0){
0114     _cone_radius           =cone_radius_in;
0115     _overlap_threshold     =overlap_threshold_in;
0116     _n_pass_max            =n_pass_max_in;
0117     _protojet_Emin         =protojet_Emin_in;
0118     _caching               =caching_in;
0119     _split_merge_scale     =split_merge_scale_in;
0120     _split_merge_stopping_scale = split_merge_stopping_scale_in;
0121     _ghost_sep_scale       = 0.0;
0122     _use_E_weighted_splitting = false;
0123   }
0124 
0125   /// minimum energy for a protojet to be considered in the split-merge step
0126   /// of the algorithm
0127   double protojet_Emin  () const {return _protojet_Emin  ;}
0128 
0129   /// return the scale to be passed to SISCone as the protojet_Emin
0130   /// -- if we have a ghost separation scale that is above the
0131   /// protojet_ptmin, then the ghost_separation_scale becomes the
0132   /// relevant one to use here
0133   double protojet_or_ghost_Emin  () const {return std::max(_protojet_Emin,
0134                                                            _ghost_sep_scale);}
0135 
0136   /// indicates scale used in split-merge
0137   SplitMergeScale split_merge_scale() const {return _split_merge_scale;}
0138   /// sets scale used in split-merge
0139   void set_split_merge_scale(SplitMergeScale sms) {_split_merge_scale = sms;}
0140 
0141   /// indicate if the splittings are done using the anti-kt distance
0142   bool split_merge_use_E_weighted_splitting() const {return _use_E_weighted_splitting;}
0143   void set_split_merge_use_E_weighted_splitting(bool val) {
0144     _use_E_weighted_splitting = val;}
0145 
0146   /// overload the default as we don't provide support 
0147   /// for passive areas.
0148   virtual bool supports_ghosted_passive_areas() const {return true;}
0149   
0150   // the things that are required by base class
0151   virtual std::string description () const;
0152   virtual void run_clustering(ClusterSequence &) const ;
0153 
0154   /// returns true because this plugin is intended for spherical
0155   /// geometries (i.e. it's an e+e- algorithm).
0156   virtual bool is_spherical() const {return true;}
0157 
0158 protected:
0159   virtual void reset_stored_plugin() const;
0160 
0161 private:
0162   double _protojet_Emin;
0163   SplitMergeScale _split_merge_scale;
0164   bool _use_E_weighted_splitting;
0165 
0166   // part needed for the cache 
0167   // variables for caching the results and the input
0168   static SharedPtr<SISConeSphericalPlugin        > stored_plugin;
0169   static SharedPtr<std::vector<PseudoJet>        > stored_particles;
0170   static SharedPtr<siscone_spherical::CSphsiscone> stored_siscone;
0171 };
0172 
0173 //======================================================================
0174 /// @ingroup extra_info
0175 /// \class SISConeSphericalExtras
0176 /// Class that provides extra information about a SISCone clustering
0177 class SISConeSphericalExtras : public SISConeBaseExtras {
0178 public:
0179   /// constructor
0180   //  it just initialises the pass information 
0181   SISConeSphericalExtras(int nparticles)
0182     : SISConeBaseExtras(nparticles){}
0183 
0184   /// access to the siscone jet def plugin (more convenient than
0185   /// getting it from the original jet definition, because here it's
0186   /// directly of the right type (rather than the base type)
0187   const SISConeSphericalPlugin* jet_def_plugin() const {
0188     return dynamic_cast<const SISConeSphericalPlugin*>(_jet_def_plugin);
0189   }
0190 
0191 private:
0192   // let us be written to by SISConePlugin
0193   friend class SISConeSphericalPlugin;
0194 };
0195 
0196 FASTJET_END_NAMESPACE        // defined in fastjet/internal/base.hh
0197 
0198 #endif // __SISCONEPLUGIN_HH__
0199