|
||||
File indexing completed on 2025-01-18 09:57:16
0001 #ifndef __FASTJET_JH_TOP_TAGGER_HH__ 0002 #define __FASTJET_JH_TOP_TAGGER_HH__ 0003 0004 //FJSTARTHEADER 0005 // $Id$ 0006 // 0007 // Copyright (c) 2005-2021, Matteo Cacciari, Gavin P. Salam and Gregory Soyez 0008 // 0009 //---------------------------------------------------------------------- 0010 // This file is part of FastJet. 0011 // 0012 // FastJet is free software; you can redistribute it and/or modify 0013 // it under the terms of the GNU General Public License as published by 0014 // the Free Software Foundation; either version 2 of the License, or 0015 // (at your option) any later version. 0016 // 0017 // The algorithms that underlie FastJet have required considerable 0018 // development. They are described in the original FastJet paper, 0019 // hep-ph/0512210 and in the manual, arXiv:1111.6097. If you use 0020 // FastJet as part of work towards a scientific publication, please 0021 // quote the version you use and include a citation to the manual and 0022 // optionally also to hep-ph/0512210. 0023 // 0024 // FastJet is distributed in the hope that it will be useful, 0025 // but WITHOUT ANY WARRANTY; without even the implied warranty of 0026 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0027 // GNU General Public License for more details. 0028 // 0029 // You should have received a copy of the GNU General Public License 0030 // along with FastJet. If not, see <http://www.gnu.org/licenses/>. 0031 //---------------------------------------------------------------------- 0032 //FJENDHEADER 0033 0034 0035 #include "fastjet/tools/TopTaggerBase.hh" 0036 #include "fastjet/CompositeJetStructure.hh" 0037 #include "fastjet/LimitedWarning.hh" 0038 0039 FASTJET_BEGIN_NAMESPACE 0040 0041 class JHTopTagger; 0042 class JHTopTaggerStructure; 0043 0044 //---------------------------------------------------------------------- 0045 /// @ingroup tools_taggers 0046 /// \class JHTopTagger 0047 /// Class that helps perform boosted top tagging using the "Johns Hopkins" 0048 /// method from arXiv:0806.0848 (Kaplan, Rehermann, Schwartz 0049 /// and Tweedie) 0050 /// 0051 ///The tagger proceeds as follows: 0052 /// - start from a jet J obtained with the Cambridge/Aachen algorithm 0053 /// - undo the last iteration j -> j_1,j_2 (with pt_1>pt_2) until the 0054 /// two subjets satisfy pt_1 > delta_p pt_J (with pt_J the pt of 0055 /// the original jet) and |y_1 - y_2| + |phi_1 - phi_2| > delta_r. 0056 /// - if one of these criteria is not satisfied, carry on the 0057 /// procedure with j_1 (discarding j_2) 0058 /// - for each of the subjets found, repeat the procedure. If some 0059 /// new substructure is found, keep these 2 new subjets, otherwise 0060 /// keep the original subjet (found during the first iteration) 0061 /// - at this stage, one has at most 4 subjets. If one has less than 0062 /// 3, the tagger has failed. 0063 /// - reconstruct the W from the 2 subjets with a mass closest to the 0064 /// W mass 0065 /// - impose that the W helicity angle be less than a threshold 0066 /// cos_theta_W_max. 0067 /// 0068 /// \section input Input conditions 0069 /// 0070 /// - the original jet must have an associated (and valid) 0071 /// ClusterSequence 0072 /// - the tagger is designed to work with jets formed by the 0073 /// Cambridge/Aachen (C/A) algorithm; if a non-C/A jet is passed to 0074 /// the tagger, a warning will be issued 0075 /// 0076 /// \section Example 0077 /// 0078 /// A JHTopTagger can be used as follows: 0079 /// 0080 /// \code 0081 /// double delta_p = 0.10; // subjets must carry at least this fraction of the original jet's p_t 0082 /// double delta_r = 0.19; // subjets must be separated by at least this Manhattan distance 0083 /// double cos_theta_W_max = 0.7; // the maximal allowed value of the W helicity angle 0084 /// JHTopTagger top_tagger(delta_p, delta_r, cos_theta_W_max); 0085 /// // indicate the acceptable range of top, W masses (default: no limits) 0086 /// top_tagger.set_top_selector(SelectorMassRange(150,200)); 0087 /// top_tagger.set_W_selector (SelectorMassRange( 65, 95)); 0088 /// // now try and tag a jet 0089 /// PseudoJet top_candidate = top_tagger(jet); // jet should come from a Cambridge/Aachen clustering 0090 /// if (top_candidate != 0) { // successful tagging 0091 /// double top_mass = top_candidate.m(); 0092 /// double W_mass = top_candidate.structure_of<JHTopTagger>().W().m(); 0093 /// } 0094 /// \endcode 0095 /// 0096 /// The full set of information available from the structure_of<JHTopTagger>() 0097 /// call is 0098 /// 0099 /// - PseudoJet W() : the W subjet of the top candidate 0100 /// - PseudoJet non_W(): non-W subjet(s) of the top candidate (i.e. the b) 0101 /// - double cos_theta_W(): the W helicity angle 0102 /// - PseudoJet W1(): the harder of the two prongs of the W 0103 /// - PseudoJet W2(): the softer of the two prongs of the W 0104 /// 0105 /// The structure of the top_candidate can also be accessed through its 0106 /// pieces() function: 0107 /// 0108 /// - top_candidate.pieces()[0]: W 0109 /// - top_candidate.pieces()[1]: non_W 0110 /// 0111 /// The W itself has two pieces (corresponding to W1, W2). 0112 /// 0113 /// The existence of the first two of the structural calls (W(), 0114 /// non_W()) and the fact that the top is made of two pieces (W, 0115 /// non_W) are features that should be common to all taggers derived 0116 /// from TopTaggerBase. 0117 /// 0118 /// See also \subpage Example13 for a full usage example. 0119 /// 0120 class JHTopTagger : public TopTaggerBase { 0121 public: 0122 /// default ctor 0123 /// The parameters are the following: 0124 /// \param delta_p fractional pt cut imposed on the subjets 0125 /// (computed as a fraction of the original jet) 0126 /// \param delta_r minimal distance between 2 subjets 0127 /// (computed as |y1-y2|+|phi1-phi2|) 0128 /// \param cos_theta_W_max the maximal value for the polarisation 0129 /// angle of the W 0130 /// \param mW the W mass 0131 /// 0132 /// The default values of all these parameters are taken from 0133 /// arXiv:0806:0848 0134 JHTopTagger(const double delta_p=0.10, const double delta_r=0.19, 0135 double cos_theta_W_max=0.7, double mW=80.4) 0136 : _delta_p(delta_p), _delta_r(delta_r), 0137 _cos_theta_W_max(cos_theta_W_max), _mW(mW){}; 0138 0139 /// returns a textual description of the tagger 0140 virtual std::string description() const; 0141 0142 /// runs the tagger on the given jet and 0143 /// returns the tagged PseudoJet if successful, or a PseudoJet==0 otherwise 0144 /// (standard access is through operator()). 0145 /// \param jet the PseudoJet to tag 0146 virtual PseudoJet result(const PseudoJet & jet) const; 0147 0148 // the type of the associated structure 0149 typedef JHTopTaggerStructure StructureType; 0150 0151 protected: 0152 /// runs the Johns Hopkins decomposition procedure 0153 std::vector<PseudoJet> _split_once(const PseudoJet & jet_to_split, 0154 const PseudoJet & reference_jet) const; 0155 0156 double _delta_p, _delta_r, _cos_theta_W_max, _mW; 0157 static LimitedWarning _warnings_nonca; 0158 }; 0159 0160 0161 //------------------------------------------------------------------------ 0162 /// @ingroup tools_taggers 0163 /// \class JHTopTaggerStructure 0164 /// the structure returned by the JHTopTagger transformer. 0165 /// 0166 /// See the JHTopTagger class description for the details of what 0167 /// is inside this structure 0168 /// 0169 class JHTopTaggerStructure : public CompositeJetStructure, public TopTaggerBaseStructure { 0170 public: 0171 /// ctor with pieces initialisation 0172 JHTopTaggerStructure(std::vector<PseudoJet> pieces_in, 0173 const JetDefinition::Recombiner *recombiner = 0) : 0174 CompositeJetStructure(pieces_in, recombiner), _cos_theta_w(0.0){} 0175 0176 /// returns the W subjet 0177 inline const PseudoJet & W() const{ 0178 return _pieces[0]; 0179 } 0180 0181 /// returns the first W subjet (the harder) 0182 inline PseudoJet W1() const{ 0183 assert(W().pieces().size()>0); 0184 return W().pieces()[0]; 0185 } 0186 0187 /// returns the second W subjet 0188 inline PseudoJet W2() const{ 0189 assert(W().pieces().size()>1); 0190 return W().pieces()[1]; 0191 } 0192 0193 /// returns the non-W subjet 0194 /// It will have 1 or 2 pieces depending on whether the tagger has 0195 /// found 3 or 4 pieces 0196 inline const PseudoJet & non_W() const{ 0197 return _pieces[1]; 0198 } 0199 0200 /// returns the W helicity angle 0201 inline double cos_theta_W() const {return _cos_theta_w;} 0202 0203 // /// returns the original jet (before tagging) 0204 // const PseudoJet & original() const {return _original_jet;} 0205 0206 0207 protected: 0208 double _cos_theta_w; ///< the W helicity angle 0209 //PseudoJet _W; ///< the tagged W 0210 //PseudoJet _non_W; ///< the remaining pieces 0211 // PseudoJet _original_jet; ///< the original jet (before tagging) 0212 0213 // allow the tagger to set these 0214 friend class JHTopTagger; 0215 }; 0216 0217 0218 0219 FASTJET_END_NAMESPACE 0220 0221 #endif // __FASTJET_JH_TOP_TAGGER_HH__ 0222
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |