00001 //STARTHEADER 00002 // $Id: PseudoJetStructureBase.hh 1985 2011-03-09 22:26:40Z soyez $ 00003 // 00004 // Copyright (c) 2005-2010, Matteo Cacciari, Gavin 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, write to the Free Software 00026 // Foundation, Inc.: 00027 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00028 //---------------------------------------------------------------------- 00029 //ENDHEADER 00030 00031 00032 #ifndef __FASTJET_PSEUDOJET_STRUCTURE_BASE_HH__ 00033 #define __FASTJET_PSEUDOJET_STRUCTURE_BASE_HH__ 00034 00035 #include "fastjet/internal/base.hh" 00036 00037 #include <vector> 00038 #include <string> 00039 00040 FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh 00041 00042 class PseudoJet; 00043 class ClusterSequence; 00044 class ClusterSequenceAreaBase; 00045 00046 /// @ingroup extra_info 00047 /// \class PseudoJetStructureBase 00048 /// 00049 /// Contains any information related to the clustering that should be 00050 /// directly accessible to PseudoJet. 00051 /// 00052 /// By default, this class implements basic access to the 00053 /// ClusterSequence related to a PseudoJet (like its constituents or 00054 /// its area). But it can be overloaded in order e.g. to give access 00055 /// to the jet substructure. 00056 /// 00057 class PseudoJetStructureBase{ 00058 public: 00059 /// default ctor 00060 PseudoJetStructureBase(){}; 00061 00062 /// default (virtual) dtor 00063 virtual ~PseudoJetStructureBase(){}; 00064 00065 /// description 00066 virtual std::string description() const{ return "PseudoJet with an unknown structure"; } 00067 00068 //------------------------------------------------------------- 00069 /// @name Direct access to the associated ClusterSequence object. 00070 /// 00071 /// Get access to the associated ClusterSequence (if any) 00072 //\{ 00073 //------------------------------------------------------------- 00074 /// returns true if there is a valid associated ClusterSequence 00075 virtual bool has_associated_cluster_sequence() const { return false;} 00076 00077 /// get a (const) pointer to the parent ClusterSequence (NULL if 00078 /// inexistent) 00079 virtual const ClusterSequence* associated_cluster_sequence() const; 00080 00081 /// if the jet has a valid associated cluster sequence then return a 00082 /// pointer to it; otherwise throw an error 00083 virtual const ClusterSequence * validated_cs() const; 00084 00085 /// if the jet has valid area information then return a pointer to 00086 /// the associated ClusterSequenceAreaBase object; otherwise throw an error 00087 virtual const ClusterSequenceAreaBase * validated_csab() const; 00088 00089 //\} 00090 00091 //------------------------------------------------------------- 00092 /// @name Methods for access to information about jet structure 00093 /// 00094 /// These allow access to jet constituents, and other jet 00095 /// subtructure information. They only work if the jet is associated 00096 /// with a ClusterSequence. 00097 //------------------------------------------------------------- 00098 //\{ 00099 00100 /// check if it has been recombined with another PseudoJet in which 00101 /// case, return its partner through the argument. Otherwise, 00102 /// 'partner' is set to 0. 00103 /// 00104 /// By default, throws an Error 00105 virtual bool has_partner(const PseudoJet &reference, PseudoJet &partner) const; 00106 00107 /// check if it has been recombined with another PseudoJet in which 00108 /// case, return its child through the argument. Otherwise, 'child' 00109 /// is set to 0. 00110 /// 00111 /// By default, throws an Error 00112 virtual bool has_child(const PseudoJet &reference, PseudoJet &child) const; 00113 00114 /// check if it is the product of a recombination, in which case 00115 /// return the 2 parents through the 'parent1' and 'parent2' 00116 /// arguments. Otherwise, set these to 0. 00117 /// 00118 /// By default, throws an Error 00119 virtual bool has_parents(const PseudoJet &reference, PseudoJet &parent1, PseudoJet &parent2) const; 00120 00121 /// check if the reference PseudoJet is contained the second one 00122 /// passed as argument. 00123 /// 00124 /// By default, throws an Error 00125 virtual bool object_in_jet(const PseudoJet &reference, const PseudoJet &jet) const; 00126 00127 00128 /// return true if the structure supports constituents. 00129 /// 00130 /// false by default 00131 virtual bool has_constituents() const {return false;} 00132 00133 /// retrieve the constituents. 00134 /// 00135 /// By default, throws an Error 00136 virtual std::vector<PseudoJet> constituents(const PseudoJet &reference) const; 00137 00138 00139 /// return true if the structure supports exclusive_subjets. 00140 virtual bool has_exclusive_subjets() const {return false;} 00141 00142 /// return a vector of all subjets of the current jet (in the sense 00143 /// of the exclusive algorithm) that would be obtained when running 00144 /// the algorithm with the given dcut. 00145 /// 00146 /// Time taken is O(m ln m), where m is the number of subjets that 00147 /// are found. If m gets to be of order of the total number of 00148 /// constituents in the jet, this could be substantially slower than 00149 /// just getting that list of constituents. 00150 /// 00151 /// By default, throws an Error 00152 virtual std::vector<PseudoJet> exclusive_subjets(const PseudoJet &reference, const double & dcut) const; 00153 00154 /// return the size of exclusive_subjets(...); still n ln n with same 00155 /// coefficient, but marginally more efficient than manually taking 00156 /// exclusive_subjets.size() 00157 /// 00158 /// By default, throws an Error 00159 virtual int n_exclusive_subjets(const PseudoJet &reference, const double & dcut) const; 00160 00161 /// return the list of subjets obtained by unclustering the supplied 00162 /// jet down to n subjets (or all constituents if there are fewer 00163 /// than n). 00164 /// 00165 /// By default, throws an Error 00166 virtual std::vector<PseudoJet> exclusive_subjets (const PseudoJet &reference, int nsub) const; 00167 00168 /// return the dij that was present in the merging nsub+1 -> nsub 00169 /// subjets inside this jet. 00170 /// 00171 /// By default, throws an Error 00172 virtual double exclusive_subdmerge(const PseudoJet &reference, int nsub) const; 00173 00174 /// return the maximum dij that occurred in the whole event at the 00175 /// stage that the nsub+1 -> nsub merge of subjets occurred inside 00176 /// this jet. 00177 /// 00178 /// By default, throws an Error 00179 virtual double exclusive_subdmerge_max(const PseudoJet &reference, int nsub) const; 00180 00181 00182 /// return true if the structure supports pieces. 00183 /// 00184 /// false by default 00185 virtual bool has_pieces() const {return false;} 00186 00187 /// retrieve the pieces building the jet. 00188 /// 00189 /// By default, throws an Error 00190 virtual std::vector<PseudoJet> pieces(const PseudoJet &reference) const; 00191 00192 00193 // the following ones require a computation of the area in the 00194 // parent ClusterSequence (See ClusterSequenceAreaBase for details) 00195 //------------------------------------------------------------------ 00196 00197 /// check if it has a defined area 00198 /// 00199 /// false by default 00200 virtual bool has_area() const {return false;} 00201 00202 /// return the jet (scalar) area. 00203 /// 00204 /// By default, throws an Error 00205 virtual double area(const PseudoJet &reference) const; 00206 00207 /// return the error (uncertainty) associated with the determination 00208 /// of the area of this jet. 00209 /// 00210 /// By default, throws an Error 00211 virtual double area_error(const PseudoJet &reference) const; 00212 00213 /// return the jet 4-vector area. 00214 /// 00215 /// By default, throws an Error 00216 virtual PseudoJet area_4vector(const PseudoJet &reference) const; 00217 00218 /// true if this jet is made exclusively of ghosts. 00219 /// 00220 /// By default, throws an Error 00221 virtual bool is_pure_ghost(const PseudoJet &reference) const; 00222 00223 //\} --- end of jet structure ------------------------------------- 00224 }; 00225 00226 FASTJET_END_NAMESPACE 00227 00228 #endif // __FASTJET_PSEUDOJET_STRUCTURE_BASE_HH__