00001 //STARTHEADER 00002 // $Id: ClusterSequenceAreaBase.hh 1761 2010-09-16 10:43:18Z soyez $ 00003 // 00004 // Copyright (c) 2005-2006, Matteo Cacciari and Gavin Salam 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 #ifndef __FASTJET_CLUSTERSEQUENCEAREABASE_HH__ 00032 #define __FASTJET_CLUSTERSEQUENCEAREABASE_HH__ 00033 00034 #include "fastjet/ClusterSequence.hh" 00035 #include "fastjet/internal/LimitedWarning.hh" 00036 #include "fastjet/RangeDefinition.hh" 00037 00038 FASTJET_BEGIN_NAMESPACE 00039 00040 /// @ingroup area_classes 00041 /// \class ClusterSequenceAreaBase 00042 /// base class that sets interface for extensions of ClusterSequence 00043 /// that provide information about the area of each jet 00044 /// 00045 /// the virtual functions here all return 0, since no area determination 00046 /// is implemented. 00047 class ClusterSequenceAreaBase : public ClusterSequence { 00048 public: 00049 00050 /// a constructor which just carries out the construction of the 00051 /// parent class 00052 template<class L> ClusterSequenceAreaBase 00053 (const std::vector<L> & pseudojets, 00054 const JetDefinition & jet_def, 00055 const bool & writeout_combinations = false) : 00056 ClusterSequence(pseudojets, jet_def, writeout_combinations) {} 00057 00058 00059 /// default constructor 00060 ClusterSequenceAreaBase() {} 00061 00062 00063 /// destructor 00064 virtual ~ClusterSequenceAreaBase() {} 00065 00066 00067 /// return the area associated with the given jet; this base class 00068 /// returns 0. 00069 virtual double area (const PseudoJet & ) const {return 0.0;} 00070 00071 /// return the error (uncertainty) associated with the determination 00072 /// of the area of this jet; this base class returns 0. 00073 virtual double area_error (const PseudoJet & ) const {return 0.0;} 00074 00075 /// return a PseudoJet whose 4-vector is defined by the following integral 00076 /// 00077 /// \int drap d\phi PseudoJet("rap,phi,pt=one") * 00078 /// * Theta("rap,phi inside jet boundary") 00079 /// 00080 /// where PseudoJet("rap,phi,pt=one") is a 4-vector with the given 00081 /// rapidity (rap), azimuth (phi) and pt=1, while Theta("rap,phi 00082 /// inside jet boundary") is a function that is 1 when rap,phi 00083 /// define a direction inside the jet boundary and 0 otherwise. 00084 /// 00085 /// This base class returns a null 4-vector. 00086 virtual PseudoJet area_4vector(const PseudoJet & ) const { 00087 return PseudoJet(0.0,0.0,0.0,0.0);} 00088 00089 /// true if a jet is made exclusively of ghosts 00090 /// 00091 /// NB: most area classes do not give any explicit ghost jets, but 00092 /// some do, and they should replace this function with their own 00093 /// version. 00094 virtual bool is_pure_ghost(const PseudoJet & ) const { 00095 return false; 00096 } 00097 00098 /// returns true if ghosts are explicitly included within 00099 /// jets for this ClusterSequence; 00100 /// 00101 /// Derived classes that do include explicit ghosts should provide 00102 /// an alternative version of this routine and set it properly. 00103 virtual bool has_explicit_ghosts() const { 00104 return false; 00105 } 00106 00107 /// return the total area, within range, that is free of jets, in 00108 /// general based on the inclusive jets 00109 virtual double empty_area(const RangeDefinition & range) const; 00110 00111 /// return the total area, within range, that is free of jets, based 00112 /// on the supplied all_jets 00113 double empty_area_from_jets(const std::vector<PseudoJet> & all_jets, 00114 const RangeDefinition & range) const; 00115 00116 /// return something similar to the number of pure ghost jets 00117 /// in the given range in an active area case. 00118 /// For the local implementation we return empty_area/(0.55 pi R^2), 00119 /// based on measured properties of ghost jets with kt and cam. Note 00120 /// that the number returned is a double. 00121 virtual double n_empty_jets(const RangeDefinition & range) const { 00122 double R = jet_def().R(); 00123 return empty_area(range)/(0.55*pi*R*R); 00124 } 00125 00126 /// the median of (pt/area) for jets contained within range, 00127 /// making use also of the info on n_empty_jets 00128 double median_pt_per_unit_area(const RangeDefinition & range) const; 00129 00130 /// the median of (pt/area_4vector) for jets contained within 00131 /// making use also of the info on n_empty_jets 00132 double median_pt_per_unit_area_4vector(const RangeDefinition & range) const; 00133 00134 /// the function that does the work for median_pt_per_unit_area and 00135 /// median_pt_per_unit_area_4vector: 00136 /// - something_is_area_4vect = false -> use plain area 00137 /// - something_is_area_4vect = true -> use 4-vector area 00138 double median_pt_per_unit_something( 00139 const RangeDefinition & range, bool use_area_4vector) const; 00140 00141 /// using jets withing range (and with 4-vector areas if 00142 /// use_area_4vector), calculate the median pt/area, as well as an 00143 /// "error" (uncertainty), which is defined as the 1-sigma 00144 /// half-width of the distribution of pt/A, obtained by looking for 00145 /// the point below which we have (1-0.6827)/2 of the jets 00146 /// (including empty jets). 00147 /// 00148 /// The subtraction for a jet with uncorrected pt pt^U and area A is 00149 /// 00150 /// pt^S = pt^U - median*A +- sigma*sqrt(A) 00151 /// 00152 /// where the error is only that associated with the fluctuations 00153 /// in the noise and not that associated with the noise having 00154 /// caused changes in the hard-particle content of the jet. 00155 /// 00156 /// NB: subtraction may also be done with 4-vector area of course, 00157 /// and this is recommended for jets with larger values of R, as 00158 /// long as rho has also been determined with a 4-vector area; 00159 /// using a scalar area causes one to neglect terms of relative 00160 /// order $R^2/8$ in the jet $p_t$. 00161 virtual void get_median_rho_and_sigma(const RangeDefinition & range, 00162 bool use_area_4vector, 00163 double & median, double & sigma, 00164 double & mean_area) const; 00165 00166 /// a more advanced version of get_median_rho_and_sigma, which allows 00167 /// one to use any "view" of the event containing all jets (so that, 00168 /// e.g. one might use Cam on a different resolution scale without 00169 /// have to rerun the algorithm). 00170 /// 00171 /// By default it will assume that "all" are not inclusive jets, 00172 /// so that in dealing with empty area it has to calculate 00173 /// the number of empty jets based on the empty area and the 00174 /// the observed <area> of jets rather than a surmised area 00175 /// 00176 /// Note that for small effective radii, this can cause problems 00177 /// because the harder jets get an area >> <ghost-jet-area> 00178 /// and so the estimate comes out all wrong. In these situations 00179 /// it is highly advisable to use an area with explicit ghosts, since 00180 /// then the "empty" jets are actually visible. 00181 virtual void get_median_rho_and_sigma(const std::vector<PseudoJet> & all_jets, 00182 const RangeDefinition & range, 00183 bool use_area_4vector, 00184 double & median, double & sigma, 00185 double & mean_area, 00186 bool all_are_inclusive = false) const; 00187 00188 /// same as the full version of get_median_rho_and_error, but without 00189 /// access to the mean_area 00190 virtual void get_median_rho_and_sigma(const RangeDefinition & range, 00191 bool use_area_4vector, 00192 double & median, double & sigma) const { 00193 double mean_area; 00194 get_median_rho_and_sigma(range, use_area_4vector, 00195 median, sigma, mean_area); 00196 } 00197 00198 00199 /// fits a form pt_per_unit_area(y) = a + b*y^2 in the range "range". 00200 /// exclude_above allows one to exclude large values of pt/area from fit. 00201 /// (if negative, the cut is discarded) 00202 /// use_area_4vector = true uses the 4vector areas. 00203 virtual void parabolic_pt_per_unit_area(double & a, double & b, 00204 const RangeDefinition & range, 00205 double exclude_above=-1.0, 00206 bool use_area_4vector=false) const; 00207 00208 /// return a vector of all subtracted jets, using area_4vector, given rho. 00209 /// Only inclusive_jets above ptmin are subtracted and returned. 00210 /// the ordering is the same as that of sorted_by_pt(cs.inclusive_jets()), 00211 /// i.e. not necessarily ordered in pt once subtracted 00212 std::vector<PseudoJet> subtracted_jets(const double rho, 00213 const double ptmin=0.0) const; 00214 00215 /// return a vector of subtracted jets, using area_4vector. 00216 /// Only inclusive_jets above ptmin are subtracted and returned. 00217 /// the ordering is the same as that of sorted_by_pt(cs.inclusive_jets()), 00218 /// i.e. not necessarily ordered in pt once subtracted 00219 std::vector<PseudoJet> subtracted_jets(const RangeDefinition & range, 00220 const double ptmin=0.0) const; 00221 00222 /// return a subtracted jet, using area_4vector, given rho 00223 PseudoJet subtracted_jet(const PseudoJet & jet, 00224 const double rho) const; 00225 00226 /// return a subtracted jet, using area_4vector; note 00227 /// that this is potentially inefficient if repeatedly used for many 00228 /// different jets, because rho will be recalculated each time 00229 /// around. 00230 PseudoJet subtracted_jet(const PseudoJet & jet, 00231 const RangeDefinition & range) const; 00232 00233 /// return the subtracted pt, given rho 00234 double subtracted_pt(const PseudoJet & jet, 00235 const double rho, 00236 bool use_area_4vector=false) const; 00237 00238 /// return the subtracted pt; note that this is 00239 /// potentially inefficient if repeatedly used for many different 00240 /// jets, because rho will be recalculated each time around. 00241 double subtracted_pt(const PseudoJet & jet, 00242 const RangeDefinition & range, 00243 bool use_area_4vector=false) const; 00244 00245 00246 private: 00247 /// handle warning messages 00248 static LimitedWarning _warnings; 00249 static LimitedWarning _warnings_zero_area; 00250 00251 /// check the jet algorithm is suitable (and if not issue a warning) 00252 void _check_jet_alg_good_for_median() const; 00253 00254 }; 00255 00256 00257 00258 FASTJET_END_NAMESPACE 00259 00260 #endif // __FASTJET_CLUSTERSEQUENCEAREABASE_HH__