// $Id$ // // Copyright (c)-, // //---------------------------------------------------------------------- // This file is part of FastJet contrib. // // It is free software; you can redistribute it and/or modify it under // the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at // your option) any later version. // // It is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public // License for more details. // // You should have received a copy of the GNU General Public License // along with this code. If not, see . //---------------------------------------------------------------------- #ifndef __FASTJET_CONTRIB_SUBJETCOUNTING_HH__ #define __FASTJET_CONTRIB_SUBJETCOUNTING_HH__ #include #include "fastjet/FunctionOfPseudoJet.hh" #include "fastjet/PseudoJet.hh" #include "fastjet/ClusterSequence.hh" #include "fastjet/JetDefinition.hh" #include FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh namespace contrib{ //------------------------------------------------------------------------ // // Implementation of the two subjet counting algorithms used in // "Learning How to Count: A High Multiplicity Search for the LHC" // Sonia El Hedri, Anson Hook, Martin Jankowiak, Jay G. Wacker // JHEP 1308:136,2013 // http://arxiv.org/abs/1302.1870 // // for usage example see example.cc // // for questions contact jankowiak@gmail.com // // tested with Fastjet 3.0.3 // //------------------------------------------------------------------------ class SubjetCountingKt : public FunctionOfPseudoJet { // ************************************************************************************** // // constructor for subjet counting with the exclusive Kt algorithm // // ~ input: f_Kt (or rather f_Kt*total_jet_pt) defines the scale at which the exclusive Kt algorithm // stops recombination; typical values might be f_Kt ~ 0.04 - 0.10 // ~ input: pt_cut is the minimum pt required of the identified subjets included in n_Kt; // typical values might be 20-70 GeV // // ~ return: a non-negative integer (accessed through the parent class's () operator as // stipulated by the FuntionOfPseudoJet paradigm: see example.cc); // alternatively the subjets can be accessed directly via getSubjets // // see original reference for details and discussion // // ************************************************************************************** public: SubjetCountingKt(double f_Kt, double pt_cut) : _f_Kt(f_Kt), _pt_cut(pt_cut) {} /// default dtor virtual ~SubjetCountingKt() {} /// returns the value of the subjet count for a jet's /// constituents. (Normally accessed by the parent class's operator()). unsigned int result(const PseudoJet& jet) const; /// get the actual subjets identified by the algorithm std::vector getSubjets(const fastjet::PseudoJet &jet) const; /// returns the description of the class std::string description() const; private: double _f_Kt, _pt_cut; // parameters defining n_Kt // internal function that computes the result unsigned int _n_Kt(const fastjet::PseudoJet &jet) const; }; //end class SubjectCountingKt class SubjetCountingCA : public FunctionOfPseudoJet { // ************************************************************************************* // // constructor for subjet counting with the CA algorithm // // ~ input: mass_cut_off is the mass scale down to which the fat jet is declustered; // typical values might be 20-70 GeV // ~ input: ycut is the asymmetry parameter that determines how hard to cut on asymmetric // splittings; typical values might be ycut ~ 0.10 - 0.15 // ~ input: R_min defines a lower angular cutoff to how far the declustering proceeds; // this parameter may not make sense or be useful depending on the source of the // constituent objects making up the fat jet (topoclusters, etc.); // can be made inoperative by being set to zero. // typical values might be R_min ~ 0.10 - 0.20 // ~ input: pt_cut is the minimum pt required of the identified subjets included in n_CA; // typical values might be 20-70 GeV // // ~ return: a non-negative integer (accessed through the parent class's () operator as // stipulated by the FuntionOfPseudoJet paradigm: see example.cc); // alternatively the subjets can be accessed directly via getSubjets // // see original reference for details and discussion // // ************************************************************************************* public: SubjetCountingCA(double mass_cut_off, double ycut, double R_min, double pt_cut) : _mass_cut_off(mass_cut_off), _ycut(ycut), _R_min(R_min), _pt_cut(pt_cut) {} /// default dtor virtual ~SubjetCountingCA(){} /// returns the value of the subjet count for a jet's /// constituents. (Normally accessed by the parent class's operator()). unsigned int result(const PseudoJet& jet) const; /// get the actual subjets identified by the algorithm std::vector getSubjets(const fastjet::PseudoJet &jet) const; /// returns the description of the class std::string description() const; private: double _mass_cut_off, _ycut, _R_min, _pt_cut; // parameters defining n_CA // internal function that calculates the result unsigned int _n_CA(const fastjet::PseudoJet &jet) const; // internal function called recursively by _n_CA void _FindHardSubst(const fastjet::PseudoJet & this_jet, std::vector & t_parts) const; }; // end class SubjectCountingCA } // namespace contrib FASTJET_END_NAMESPACE #endif // __FASTJET_CONTRIB_SUBJETCOUNTING_HH__