FastJet 3.0.6
|
00001 //STARTHEADER 00002 // $Id: ClusterSequenceStructure.hh 3071 2013-04-01 12:52:46Z cacciari $ 00003 // 00004 // Copyright (c) 2005-2011, Matteo Cacciari, Gavin P. Salam and Gregory Soyez 00005 // 00006 //---------------------------------------------------------------------- 00007 // This file is part of FastJet. 00008 // 00009 // FastJet is free software; you can redistribute it and/or modify 00010 // it under the terms of the GNU General Public License as published by 00011 // the Free Software Foundation; either version 2 of the License, or 00012 // (at your option) any later version. 00013 // 00014 // The algorithms that underlie FastJet have required considerable 00015 // development and are described in hep-ph/0512210. If you use 00016 // FastJet as part of work towards a scientific publication, please 00017 // include a citation to the FastJet paper. 00018 // 00019 // FastJet is distributed in the hope that it will be useful, 00020 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00021 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00022 // GNU General Public License for more details. 00023 // 00024 // You should have received a copy of the GNU General Public License 00025 // along with FastJet. If not, see <http://www.gnu.org/licenses/>. 00026 //---------------------------------------------------------------------- 00027 //ENDHEADER 00028 00029 00030 #ifndef __FASTJET_CLUSTER_SEQUENCE_STRUCTURE_HH__ 00031 #define __FASTJET_CLUSTER_SEQUENCE_STRUCTURE_HH__ 00032 00033 #include "fastjet/internal/base.hh" 00034 #include "fastjet/SharedPtr.hh" 00035 #include "fastjet/PseudoJetStructureBase.hh" 00036 00037 #include <vector> 00038 00039 FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh 00040 00041 /// @ingroup extra_info 00042 /// \class ClusterSequenceStructure 00043 /// 00044 /// Contains any information related to the clustering that should be 00045 /// directly accessible to PseudoJet. 00046 /// 00047 /// By default, this class implements basic access to the 00048 /// ClusterSequence related to a PseudoJet (like its constituents or 00049 /// its area). But it can be overloaded in order e.g. to give access 00050 /// to the jet substructure. 00051 /// 00052 // Design question: Do we only put the methods that can be overloaded 00053 // or do we put everything a PJ can have access to? I think both cost 00054 // the same number of indirections. The first option limits the amount 00055 // of coding and maybe has a clearer structure. The second is more 00056 // consistent (everything related to the same thing is at the same 00057 // place) and gives better access for derived classes. We'll go for 00058 // the second option. 00059 class ClusterSequenceStructure : public PseudoJetStructureBase{ 00060 public: 00061 /// default ctor 00062 ClusterSequenceStructure() : _associated_cs(NULL){} 00063 00064 /// ctor with initialisation to a given ClusterSequence 00065 /// 00066 /// In principle, this is reserved for initialisation by the parent 00067 /// ClusterSequence 00068 ClusterSequenceStructure(const ClusterSequence *cs){ 00069 set_associated_cs(cs); 00070 }; 00071 00072 /// default (virtual) dtor 00073 virtual ~ClusterSequenceStructure(); 00074 00075 /// description 00076 virtual std::string description() const{ return "PseudoJet with an associated ClusterSequence"; } 00077 00078 //------------------------------------------------------------- 00079 /// @name Direct access to the associated ClusterSequence object. 00080 /// 00081 /// Get access to the associated ClusterSequence (if any) 00082 //\{ 00083 //------------------------------------------------------------- 00084 /// returns true if there is an associated ClusterSequence 00085 virtual bool has_associated_cluster_sequence() const{ return true;} 00086 00087 /// get a (const) pointer to the parent ClusterSequence (NULL if 00088 /// inexistent) 00089 virtual const ClusterSequence* associated_cluster_sequence() const; 00090 00091 /// returns true if there is a valid associated ClusterSequence 00092 virtual bool has_valid_cluster_sequence() const; 00093 00094 /// if the jet has a valid associated cluster sequence then return a 00095 /// pointer to it; otherwise throw an error 00096 virtual const ClusterSequence * validated_cs() const; 00097 00098 #ifndef __FJCORE__ 00099 /// if the jet has valid area information then return a pointer to 00100 /// the associated ClusterSequenceAreaBase object; otherwise throw an error 00101 virtual const ClusterSequenceAreaBase * validated_csab() const; 00102 #endif // __FJCORE__ 00103 00104 /// set the associated csw 00105 virtual void set_associated_cs(const ClusterSequence * new_cs){ 00106 _associated_cs = new_cs; 00107 } 00108 //\} 00109 00110 //------------------------------------------------------------- 00111 /// @name Methods for access to information about jet structure 00112 /// 00113 /// These allow access to jet constituents, and other jet 00114 /// subtructure information. They only work if the jet is associated 00115 /// with a ClusterSequence. 00116 //------------------------------------------------------------- 00117 //\{ 00118 00119 /// check if it has been recombined with another PseudoJet in which 00120 /// case, return its partner through the argument. Otherwise, 00121 /// 'partner' is set to 0. 00122 /// 00123 /// an Error is thrown if this PseudoJet has no currently valid 00124 /// associated ClusterSequence 00125 virtual bool has_partner(const PseudoJet &reference, PseudoJet &partner) const; 00126 00127 /// check if it has been recombined with another PseudoJet in which 00128 /// case, return its child through the argument. Otherwise, 'child' 00129 /// is set to 0. 00130 /// 00131 /// an Error is thrown if this PseudoJet has no currently valid 00132 /// associated ClusterSequence 00133 virtual bool has_child(const PseudoJet &reference, PseudoJet &child) const; 00134 00135 /// check if it is the product of a recombination, in which case 00136 /// return the 2 parents through the 'parent1' and 'parent2' 00137 /// arguments. Otherwise, set these to 0. 00138 /// 00139 /// an Error is thrown if this PseudoJet has no currently valid 00140 /// associated ClusterSequence 00141 virtual bool has_parents(const PseudoJet &reference, PseudoJet &parent1, PseudoJet &parent2) const; 00142 00143 /// check if the reference PseudoJet is contained in the second one 00144 /// passed as argument. 00145 /// 00146 /// an Error is thrown if this PseudoJet has no currently valid 00147 /// associated ClusterSequence 00148 /// 00149 /// false is returned if the 2 PseudoJet do not belong the same 00150 /// ClusterSequence 00151 virtual bool object_in_jet(const PseudoJet &reference, const PseudoJet &jet) const; 00152 00153 /// return true if the structure supports constituents. 00154 /// 00155 /// an Error is thrown if this PseudoJet has no currently valid 00156 /// associated ClusterSequence 00157 virtual bool has_constituents() const; 00158 00159 /// retrieve the constituents. 00160 /// 00161 /// an Error is thrown if this PseudoJet has no currently valid 00162 /// associated ClusterSequence 00163 virtual std::vector<PseudoJet> constituents(const PseudoJet &reference) const; 00164 00165 00166 /// return true if the structure supports exclusive_subjets. 00167 /// 00168 /// an Error is thrown if this PseudoJet has no currently valid 00169 /// associated ClusterSequence 00170 virtual bool has_exclusive_subjets() const; 00171 00172 /// return a vector of all subjets of the current jet (in the sense 00173 /// of the exclusive algorithm) that would be obtained when running 00174 /// the algorithm with the given dcut. 00175 /// 00176 /// Time taken is O(m ln m), where m is the number of subjets that 00177 /// are found. If m gets to be of order of the total number of 00178 /// constituents in the jet, this could be substantially slower than 00179 /// just getting that list of constituents. 00180 /// 00181 /// an Error is thrown if this PseudoJet has no currently valid 00182 /// associated ClusterSequence 00183 virtual std::vector<PseudoJet> exclusive_subjets(const PseudoJet &reference, const double & dcut) const; 00184 00185 /// return the size of exclusive_subjets(...); still n ln n with same 00186 /// coefficient, but marginally more efficient than manually taking 00187 /// exclusive_subjets.size() 00188 /// 00189 /// an Error is thrown if this PseudoJet has no currently valid 00190 /// associated ClusterSequence 00191 virtual int n_exclusive_subjets(const PseudoJet &reference, const double & dcut) const; 00192 00193 /// return the list of subjets obtained by unclustering the supplied 00194 /// jet down to nsub subjets (or all constituents if there are fewer 00195 /// than nsub). 00196 /// 00197 /// requires nsub ln nsub time 00198 /// 00199 /// an Error is thrown if this PseudoJet has no currently valid 00200 /// associated ClusterSequence 00201 virtual std::vector<PseudoJet> exclusive_subjets_up_to (const PseudoJet &reference, int nsub) const; 00202 00203 /// return the dij that was present in the merging nsub+1 -> nsub 00204 /// subjets inside this jet. 00205 /// 00206 /// an Error is thrown if this PseudoJet has no currently valid 00207 /// associated ClusterSequence 00208 virtual double exclusive_subdmerge(const PseudoJet &reference, int nsub) const; 00209 00210 /// return the maximum dij that occurred in the whole event at the 00211 /// stage that the nsub+1 -> nsub merge of subjets occurred inside 00212 /// this jet. 00213 /// 00214 /// an Error is thrown if this PseudoJet has no currently valid 00215 /// associated ClusterSequence 00216 virtual double exclusive_subdmerge_max(const PseudoJet &reference, int nsub) const; 00217 00218 00219 //------------------------------------------------------------------- 00220 // information related to the pieces of the jet 00221 //------------------------------------------------------------------- 00222 /// by convention, a jet associated with a ClusterSequence will have 00223 /// its parents as pieces 00224 virtual bool has_pieces(const PseudoJet &reference) const; 00225 00226 /// by convention, a jet associated with a ClusterSequence will have 00227 /// its parents as pieces 00228 /// 00229 /// if it has no parents, then there will only be a single piece: 00230 /// itself 00231 /// 00232 /// Note that to answer that question, we need to access the cluster 00233 /// sequence. If the cluster sequence has gone out of scope, an 00234 /// error will be thrown 00235 virtual std::vector<PseudoJet> pieces(const PseudoJet &reference) const; 00236 00237 00238 // the following ones require a computation of the area in the 00239 // parent ClusterSequence (See ClusterSequenceAreaBase for details) 00240 //------------------------------------------------------------------ 00241 #ifndef __FJCORE__ 00242 00243 /// check if it has a defined area 00244 virtual bool has_area() const; 00245 00246 /// return the jet (scalar) area. 00247 /// throws an Error if there is no support for area in the parent CS 00248 virtual double area(const PseudoJet &reference) const; 00249 00250 /// return the error (uncertainty) associated with the determination 00251 /// of the area of this jet. 00252 /// throws an Error if there is no support for area in the parent CS 00253 virtual double area_error(const PseudoJet &reference) const; 00254 00255 /// return the jet 4-vector area. 00256 /// throws an Error if there is no support for area in the parent CS 00257 virtual PseudoJet area_4vector(const PseudoJet &reference) const; 00258 00259 /// true if this jet is made exclusively of ghosts. 00260 /// throws an Error if there is no support for area in the parent CS 00261 virtual bool is_pure_ghost(const PseudoJet &reference) const; 00262 00263 #endif // __FJCORE__ 00264 //\} --- end of jet structure ------------------------------------- 00265 00266 protected: 00267 const ClusterSequence *_associated_cs; 00268 }; 00269 00270 FASTJET_END_NAMESPACE 00271 00272 #endif // __FASTJET_CLUSTER_SEQUENCE_STRUCTURE_HH__