FastJet 3.0beta1
|
00001 #ifndef __FASTJET_JH_TOP_TAGGER_HH__ 00002 #define __FASTJET_JH_TOP_TAGGER_HH__ 00003 00004 //STARTHEADER 00005 // $Id: JHTopTagger.hh 2493 2011-08-03 15:48:16Z salam $ 00006 // 00007 // Copyright (c) 2005-2011, Matteo Cacciari, Gavin Salam and Gregory Soyez 00008 // 00009 //---------------------------------------------------------------------- 00010 // This file is part of FastJet. 00011 // 00012 // FastJet is free software; you can redistribute it and/or modify 00013 // it under the terms of the GNU General Public License as published by 00014 // the Free Software Foundation; either version 2 of the License, or 00015 // (at your option) any later version. 00016 // 00017 // The algorithms that underlie FastJet have required considerable 00018 // development and are described in hep-ph/0512210. If you use 00019 // FastJet as part of work towards a scientific publication, please 00020 // include a citation to the FastJet paper. 00021 // 00022 // FastJet is distributed in the hope that it will be useful, 00023 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00024 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00025 // GNU General Public License for more details. 00026 // 00027 // You should have received a copy of the GNU General Public License 00028 // along with FastJet; if not, write to the Free Software 00029 // Foundation, Inc.: 00030 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00031 //---------------------------------------------------------------------- 00032 //ENDHEADER 00033 00034 00035 #include <fastjet/tools/TopTaggerBase.hh> 00036 #include <fastjet/CompositeJetStructure.hh> 00037 #include <fastjet/internal/LimitedWarning.hh> 00038 00039 FASTJET_BEGIN_NAMESPACE 00040 00041 class JHTopTagger; 00042 class JHTopTaggerStructure; 00043 00044 //---------------------------------------------------------------------- 00045 /// @ingroup tools_taggers 00046 /// \class JHTopTagger 00047 /// Class that helps perform boosted top tagging using the "Johns 00048 /// Hopkins" method from arXiv:0806.0848 (Kaplan, Rehermann, Schwartz 00049 /// and Tweedie) 00050 /// 00051 ///The tagger proceeds as follows: 00052 /// - start from a jet J obtained with the Cambridge/Aachen algorithm 00053 /// - undo the last iteration j -> j_1,j_2 (with pt_1>pt_2) until the 00054 /// two subjets satisfy pt_1 > delta_p pt_J (with pt_J the pt of 00055 /// the original jet) and |y_1 - y_2| + |phi_1 - phi_2| > delta_r. 00056 /// - if one of these criteria is not satisfied, carry on the 00057 /// procedure with j_1 (discarding j_2) 00058 /// - for each of the subjets found, repeat the procedure. If some 00059 /// new substructure is found, keep these 2 new subjets, otherwise 00060 /// keep the original subjet (found during the first iteration) 00061 /// - at this stage, one has at most 4 subjets. If one has less than 00062 /// 3, the tagger has failed. 00063 /// - reconstruct the W from the 2 subjets with a mass closest to the 00064 /// W mass 00065 /// - impose that the W helicity angle be less than a threshold 00066 /// cos_theta_W_max. 00067 /// 00068 /// \section input Input conditions 00069 /// 00070 /// - the original jet must have an associated (and valid) 00071 /// ClusterSequence 00072 /// - the tagger is designed to work with jets formed by the 00073 /// Cambridge/Aachen (C/A) algorithm; if a non-C/A jet is passed to 00074 /// the tagger, a warning will be issued 00075 /// 00076 /// \section Example 00077 /// 00078 /// A JHTopTagger can be used as follows: 00079 /// 00080 /// \code 00081 /// double delta_p = 0.10; // subjets must carry at least this fraction of the original jet's $p_t$ 00082 /// double delta_r = 0.19; // subjets must be separated by at least this Manhattan distance 00083 /// double cos_theta_W_max = 0.7; // the maximal allowed value of the W helicity angle 00084 /// JHTopTagger top_tagger(delta_p, delta_r, cos_theta_W_max); 00085 /// // indicate the acceptable range of top, W masses (default: no limits) 00086 /// top_tagger.set_top_selector(SelectorMassRange(150,200)); 00087 /// top_tagger.set_W_selector (SelectorMassRange( 65, 95)); 00088 /// // now try and tag a jet 00089 /// PseudoJet top_candidate = top_tagger(jet); // jet should come from a Cambridge/Aachen clustering 00090 /// if (top_candidate != 0) { // successful tagging 00091 /// double top_mass = top_candidate.m(); 00092 /// double W_mass = top_candidate.structure_of<JHTopTagger>().W().m(); 00093 /// } 00094 /// \endcode 00095 /// 00096 /// The full set of information available from the structure_of<JHTopTagger>() 00097 /// call is 00098 /// 00099 /// - PseudoJet W() : the W subjet of the top candidate 00100 /// - PseudoJet non_W(): non-W subjet(s) of the top candidate (i.e. the b) 00101 /// - double cos_theta_W(): the W helicity angle 00102 /// - PseudoJet W1(): the harder of the two prongs of the W 00103 /// - PseudoJet W2(): the softer of the two prongs of the W 00104 /// 00105 /// The structure of the top_candidate can also be accessed through its 00106 /// pieces() function: 00107 /// 00108 /// - top_candidate.pieces()[0]: W 00109 /// - top_candidate.pieces()[1]: non_W 00110 /// 00111 /// The W itself has two pieces (corresponding to W1, W2). 00112 /// 00113 /// The existence of the first two of the structural calls (W(), 00114 /// non_W()) and the fact that the top is made of two pieces (W, 00115 /// non_W) are features that should be common to all taggers derived 00116 /// from TopTaggerBase. 00117 /// 00118 /// See also \subpage Example13 for a full usage example. 00119 /// 00120 class JHTopTagger : public TopTaggerBase { 00121 public: 00122 /// default ctor 00123 /// The parameters are the following: 00124 /// \param delta_p fractional pt cut imposed on the subjets 00125 /// (computed as a fraction of the original jet) 00126 /// \param delta_r minimal distance between 2 subjets 00127 /// (computed as |y1-y2|+|phi1-phi2|) 00128 /// \param cos_theta_W_max the maximal value for the polarisation 00129 /// angle of the W 00130 /// \param mW the W mass 00131 /// 00132 /// The default values of all these parameters are taken from 00133 /// arXiv:0806:0848 00134 JHTopTagger(const double delta_p=0.10, const double delta_r=0.19, 00135 double cos_theta_W_max=0.7, double mW=80.4) 00136 : _delta_p(delta_p), _delta_r(delta_r), 00137 _cos_theta_W_max(cos_theta_W_max), _mW(mW){}; 00138 00139 /// returns a textual description of the tagger 00140 virtual std::string description() const; 00141 00142 /// runs the tagger on the given jet and 00143 /// returns the tagged PseudoJet if successful, or a PseudoJet==0 otherwise 00144 /// (standard access is through operator()). 00145 /// \param jet the PseudoJet to tag 00146 virtual PseudoJet result(const PseudoJet & jet) const; 00147 00148 /// the type of the associated structure 00149 typedef JHTopTaggerStructure StructureType; 00150 00151 protected: 00152 /// runs the Johns Hopkins decomposition procedure 00153 std::vector<PseudoJet> _split_once(const PseudoJet & jet_to_split, 00154 const PseudoJet & reference_jet) const; 00155 00156 /// computes the W helicity angle 00157 double _cos_theta_W(const PseudoJet & result) const; 00158 00159 double _delta_p, _delta_r, _cos_theta_W_max, _mW; 00160 static LimitedWarning _warnings_nonca; 00161 }; 00162 00163 00164 //------------------------------------------------------------------------ 00165 /// @ingroup tools_taggers 00166 /// \class JHTopTaggerStructure 00167 /// the structure returned by the JHTopTagger transformer. 00168 /// 00169 /// See the JHTopTagger class description for the details of what 00170 /// is inside this structure 00171 /// 00172 class JHTopTaggerStructure : public CompositeJetStructure, public TopTaggerBaseStructure { 00173 public: 00174 /// ctor with pieces initialisation 00175 JHTopTaggerStructure(std::vector<PseudoJet> pieces, 00176 const JetDefinition::Recombiner *recombiner = 0) : 00177 CompositeJetStructure(pieces, recombiner), _cos_theta_w(0.0){} 00178 00179 /// returns the W subjet 00180 inline const PseudoJet & W() const{ 00181 return _pieces[0]; 00182 } 00183 00184 /// returns the first W subjet (the harder) 00185 inline PseudoJet W1() const{ 00186 assert(W().pieces().size()>0); 00187 return W().pieces()[0]; 00188 } 00189 00190 /// returns the second W subjet 00191 inline PseudoJet W2() const{ 00192 assert(W().pieces().size()>1); 00193 return W().pieces()[1]; 00194 } 00195 00196 /// returns the non-W subjet 00197 /// It will have 1 or 2 pieces depending on whether the tagger has 00198 /// found 3 or 4 pieces 00199 inline const PseudoJet & non_W() const{ 00200 return _pieces[1]; 00201 } 00202 00203 /// returns the W helicity angle 00204 inline double cos_theta_W() const {return _cos_theta_w;} 00205 00206 // /// returns the original jet (before tagging) 00207 // const PseudoJet & original() const {return _original_jet;} 00208 00209 00210 protected: 00211 double _cos_theta_w; ///< the W helicity angle 00212 //PseudoJet _W; ///< the tagged W 00213 //PseudoJet _non_W; ///< the remaining pieces 00214 // PseudoJet _original_jet; ///< the original jet (before tagging) 00215 00216 // allow the tagger to set these 00217 friend class JHTopTagger; 00218 }; 00219 00220 00221 00222 FASTJET_END_NAMESPACE 00223 00224 #endif // __FASTJET_JH_TOP_TAGGER_HH__ 00225