// Nsubjettiness Package // Questions/Comments? jthaler@jthaler.net // // Copyright (c) 2011-14 // Jesse Thaler, Ken Van Tilburg, Christopher K. Vermilion, and TJ Wilkason // // $Id: Nsubjettiness.hh 822 2015-06-15 23:52:57Z jthaler $ //---------------------------------------------------------------------- // 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_NSUBJETTINESS_HH__ #define __FASTJET_CONTRIB_NSUBJETTINESS_HH__ #include #include "Njettiness.hh" #include "fastjet/FunctionOfPseudoJet.hh" #include #include FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh namespace contrib { // Classes defined in this file. class Nsubjettiness; class NsubjettinessRatio; ///------------------------------------------------------------------------ /// \class Nsubjettiness /// \brief Implements the N-subjettiness jet shape /// /** * The N-jettiness jet shape. * * Nsubjettiness extends the concept of Njettiness to a jet shape, but other * than the set of particles considered, they are identical. This class * wraps the core Njettiness code to provide the fastjet::FunctionOfPseudoJet * interface for convenience in larger analyses. * * The recommended AxesDefinitions are: * KT_Axes : exclusive kt axes * WTA_KT_Axes : exclusive kt with winner-take-all recombination * OnePass_KT_Axes : one-pass minimization from kt starting point * OnePass_WTA_KT_Axes : one-pass min. from wta_kt starting point * More AxesDefinitions are listed in the README and defined in AxesDefinition.hh * * The recommended MeasureDefinitions are (with the corresponding parameters) * NormalizedMeasure(beta,R0) * : This was the original N-subjettiness measure (dimensionless) * UnnormalizedMeasure(beta) * : This is the new recommended default, same as above but without * : the normalization factor, and hence has units of GeV * NormalizedCutoffMeasure(beta,R0,Rcutoff) * : Same as normalized_measure, but cuts off at Rcutoff * UnnormalizedCutoffMeasure(beta,Rcutoff) * : Same as unnormalized_measure, but cuts off at Rcutoff * More MeasureDefinitions are listed in the README and defined in MeasureDefinition.hh * * For example, for the UnnormalizedMeasure(beta), N-subjettiness is defined as: * * tau_N = Sum_{i in jet} p_T^i min((DR_i1)^beta, (DR_i2)^beta, ...) * * DR_ij is the distance sqrt(Delta_phi^2 + Delta_rap^2) between particle i * and jet j. * * The NormalizedMeausure include an extra parameter R0, and the various cutoff * measures include an Rcutoff, which effectively defines an angular cutoff * similar in effect to a cone-jet radius. */ class Nsubjettiness : public FunctionOfPseudoJet { public: /// Main constructor, which takes N, the AxesDefinition, and the MeasureDefinition. /// The Definitions are given in AxesDefinition.hh and MeasureDefinition.hh Nsubjettiness(int N, const AxesDefinition& axes_def, const MeasureDefinition& measure_def) : _njettinessFinder(axes_def,measure_def), _N(N) {} /// Returns tau_N, measured on the constituents of this jet double result(const PseudoJet& jet) const; /// Returns components of tau_N, so that user can find individual tau values. TauComponents component_result(const PseudoJet& jet) const; /// To set axes in manual mode void setAxes(const std::vector & myAxes) { // Note that cross check that manual mode has been set is in Njettiness _njettinessFinder.setAxes(myAxes); } /// returns seed axes used for onepass minimization (otherwise same as currentAxes) std::vector seedAxes() const { return _njettinessFinder.seedAxes(); } /// returns current axes found by result() calculation std::vector currentAxes() const { return _njettinessFinder.currentAxes(); } /// returns subjet regions found by result() calculation (these have valid constituents) /// Note that the axes and the subjets are not the same std::vector currentSubjets() const { return _njettinessFinder.currentJets(); } /// returns components of tau_N without recalculating anything TauComponents currentTauComponents() const { return _njettinessFinder.currentTauComponents(); } /// returns components of tau_N without recalculating anything TauPartition currentPartition() const { return _njettinessFinder.currentPartition(); } private: /// Core Njettiness code that is called Njettiness _njettinessFinder; // TODO: should muck with this so result can be const without this mutable /// Number of subjets to find int _N; /// Warning if the user tries to use v1.0.3 constructor. static LimitedWarning _old_constructor_warning; public: // The following interfaces are included for backwards compatibility, but no longer recommended. // They may be deleted in a future release /// \deprecated /// Alternative constructors that define the measure via enums and parameters /// These constructors will be removed in v3.0 /// Zero parameter arguments /// (Currently, no measure uses this) Nsubjettiness(int N, Njettiness::AxesMode axes_mode, Njettiness::MeasureMode measure_mode) : _njettinessFinder(axes_mode, measure_mode, 0), _N(N) { _old_constructor_warning.warn("Nsubjettiness: You are using the old style constructor. This is deprecated as of v2.1 and will be removed in v3.0. Please use the Nsubjettiness constructor based on AxesDefinition and MeasureDefinition instead."); } /// \deprecated /// Construcotr for one parameter argument /// (for unnormalized_measure, para1=beta) Nsubjettiness(int N, Njettiness::AxesMode axes_mode, Njettiness::MeasureMode measure_mode, double para1) : _njettinessFinder(axes_mode, measure_mode, 1, para1), _N(N) { _old_constructor_warning.warn("Nsubjettiness: You are using the old style constructor. This is deprecated as of v2.1 and will be removed in v3.0. Please use the Nsubjettiness constructor based on AxesDefinition and MeasureDefinition instead."); } /// \deprecated /// Constructor for two parameter arguments /// (for normalized_measure, para1=beta, para2=R0) /// (for unnormalized_cutoff_measure, para1=beta, para2=Rcutoff) Nsubjettiness(int N, Njettiness::AxesMode axes_mode, Njettiness::MeasureMode measure_mode, double para1, double para2) : _njettinessFinder(axes_mode, measure_mode, 2, para1, para2), _N(N) { _old_constructor_warning.warn("Nsubjettiness: You are using the old style constructor. This is deprecated as of v2.1 and will be removed in v3.0. Please use the Nsubjettiness constructor based on AxesDefinition and MeasureDefinition instead."); } /// \deprecated /// Constructor for three parameter arguments /// (for unnormalized_cutoff_measure, para1=beta, para2=R0, para3=Rcutoff) Nsubjettiness(int N, Njettiness::AxesMode axes_mode, Njettiness::MeasureMode measure_mode, double para1, double para2, double para3) : _njettinessFinder(axes_mode, measure_mode, 3, para1, para2, para3), _N(N) { _old_constructor_warning.warn("Nsubjettiness: You are using the old style constructor. This is deprecated as of v2.1 and will be removed in v3.0. Please use the Nsubjettiness constructor based on AxesDefinition and MeasureDefinition instead."); } /// \deprecated /// Old constructor for backwards compatibility with v1.0, /// where normalized_cutoff_measure was the only option Nsubjettiness(int N, Njettiness::AxesMode axes_mode, double beta, double R0, double Rcutoff=std::numeric_limits::max()) : _njettinessFinder(axes_mode, NormalizedCutoffMeasure(beta,R0,Rcutoff)), _N(N) { _old_constructor_warning.warn("Nsubjettiness: You are using the old style constructor. This is deprecated as of v2.1 and will be removed in v3.0. Please use the Nsubjettiness constructor based on AxesDefinition and MeasureDefinition instead."); } }; ///------------------------------------------------------------------------ /// \class NsubjettinessRatio /// \brief Implements ratios of N-subjettiness jet shapes /// /// NsubjettinessRatio uses the results from Nsubjettiness to calculate the ratio /// tau_N/tau_M, where N and M are specified by the user. The ratio of different tau values /// is often used in analyses, so this class is helpful to streamline code. Note that /// manual axis mode is not supported class NsubjettinessRatio : public FunctionOfPseudoJet { public: /// Main constructor. Apart from specifying both N and M, the same options as Nsubjettiness NsubjettinessRatio(int N, int M, const AxesDefinition & axes_def, const MeasureDefinition & measure_def) : _nsub_numerator(N,axes_def,measure_def), _nsub_denominator(M,axes_def,measure_def) { if (axes_def.needsManualAxes()) { throw Error("NsubjettinessRatio does not support ManualAxes mode."); } } /// Returns tau_N/tau_M based off the input jet using result function from Nsubjettiness double result(const PseudoJet& jet) const; private: Nsubjettiness _nsub_numerator; ///< Function for numerator Nsubjettiness _nsub_denominator; ///< Function for denominator public: // The following interfaces are included for backwards compatibility, but no longer recommended. // They may be deprecated at some point. /// \deprecated /// Old-style constructor for zero arguments /// Alternative constructor with enums and parameters /// Again, likely to be removed NsubjettinessRatio(int N, int M, Njettiness::AxesMode axes_mode, Njettiness::MeasureMode measure_mode) : _nsub_numerator(N, axes_mode, measure_mode), _nsub_denominator(M, axes_mode, measure_mode) {} /// \deprecated /// Old-style constructor for one argument NsubjettinessRatio(int N, int M, Njettiness::AxesMode axes_mode, Njettiness::MeasureMode measure_mode, double para1) : _nsub_numerator(N, axes_mode, measure_mode, para1), _nsub_denominator(M, axes_mode, measure_mode, para1) {} /// \deprecated /// Old-style constructor for 2 arguments NsubjettinessRatio(int N, int M, Njettiness::AxesMode axes_mode, Njettiness::MeasureMode measure_mode, double para1, double para2) : _nsub_numerator(N, axes_mode, measure_mode, para1, para2), _nsub_denominator(M, axes_mode, measure_mode, para1, para2) {} /// \deprecated /// Old-style constructor for 3 arguments NsubjettinessRatio(int N, int M, Njettiness::AxesMode axes_mode, Njettiness::MeasureMode measure_mode, double para1, double para2, double para3) : _nsub_numerator(N, axes_mode, measure_mode, para1, para2, para3), _nsub_denominator(M, axes_mode, measure_mode, para1, para2, para3) {} }; } // namespace contrib FASTJET_END_NAMESPACE #endif // __FASTJET_CONTRIB_NSUBJETTINESS_HH__