// Nsubjettiness Package
// Questions/Comments? jthaler@jthaler.net
//
// Copyright (c) 2011-14
// Jesse Thaler, Ken Van Tilburg, Christopher K. Vermilion, and TJ Wilkason
//
// $Id: XConePlugin.hh 748 2014-10-02 06:13:28Z tjwilk $
//----------------------------------------------------------------------
// 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_XCONEPLUGIN_HH__
#define __FASTJET_CONTRIB_XCONEPLUGIN_HH__
#include
#include "NjettinessPlugin.hh"
#include "fastjet/ClusterSequence.hh"
#include "fastjet/JetDefinition.hh"
#include
#include
FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh
namespace contrib {
///------------------------------------------------------------------------
/// \class XConePlugin
/// \brief Implements the XCone Jet Algorithm
/**
* An exclusive jet finder that identifies N jets. First N axes are found, then
* particles are assigned to the nearest (approximte DeltaR) axis and for each axis the
* corresponding jet is simply the four-momentum sum of these particles.
*
* The XConePlugin is based on NjettinessPlugin, but with sensible default
* values for the AxesDefinition and MeasureDefinition. There are three arguments
*
* int N: number of exclusive jets to be found
* double R0: approximate jet radius
* double beta: determines style of jet finding with the recommended values being:
* beta = 2: standard "mean" jets where jet momentum/axis align approximately.
* beta = 1: recoil-free "median" variant where jet axis points at hardest cluster.
*
* The AxesDefinition is OnePass_GenET_GenKT_Axes, which uses a generalized kT
* clustering algorithm matched to the beta value.
*
* The MeasureDefinition is the XConeMeasure, which is based on the
* ConicalGeometric measure.
*/
class XConePlugin : public NjettinessPlugin {
public:
/// Constructor with N, R0, and beta as the options. beta = 2.0 is the default
/// All this does is use the NjettinessPlugin with OnePass_GenET_GenKT_Axes and the XConeMeasure.
/// For more advanced usage, call NjettinessPlugin directly
/// Note that the order of the R0 and beta values is reversed from the XConeMeasure to
/// standard usage for Plugins.
XConePlugin(int N, double R0, double beta = 2.0)
: NjettinessPlugin(N,
OnePass_GenET_GenKT_Axes(calc_delta(beta), calc_power(beta), R0), // use recommended axes method only
XConeMeasure(beta, R0) // use recommended XCone measure.
),
_N(N), _R0(R0), _beta(beta)
{}
// The things that are required by base class.
virtual std::string description () const;
virtual double R() const {return _R0;}
// run_clustering is done by NjettinessPlugin
virtual ~XConePlugin() {}
private:
/// Static call used within the constructor to set the recommended delta value
static double calc_delta(double beta) {
double delta;
if (beta > 1) delta = 1/(beta - 1);
else delta = std::numeric_limits::max(); // use winner take all
return delta;
}
/// Static call used within the constructor to set the recommended p value
static double calc_power(double beta) {
return (double) 1.0/beta;
}
double _N; ///< Number of desired jets
double _R0; ///< Jet radius
double _beta; ///< Angular exponent (beta = 2.0 is dafault, beta = 1.0 is recoil-free)
public:
};
/// \class PseudoXConePlugin
/// \brief Implements a faster, non-optimal version of the XCone Jet Algorithm
///
/// A "poor man's" version of XCone with no minimization step
/// Right now, used just for testing purposes by the developers
class PseudoXConePlugin : public NjettinessPlugin {
public:
/// Constructor with N, R0, and beta as the options. beta = 2.0 is the default
/// All this does is use the NjettinessPlugin with GenET_GenKT_Axes and the XConeMeasure.
PseudoXConePlugin(int N, double R0, double beta = 2.0)
: NjettinessPlugin(N,
GenET_GenKT_Axes(calc_delta(beta), calc_power(beta), R0), // poor man's axes
XConeMeasure(beta, R0) // use recommended XCone measure.
),
_N(N), _R0(R0), _beta(beta)
{}
// The things that are required by base class.
virtual std::string description () const;
virtual double R() const {return _R0;}
// run_clustering is done by NjettinessPlugin
virtual ~PseudoXConePlugin() {}
private:
/// Static call used within the constructor to set the recommended delta value
static double calc_delta(double beta) {
double delta;
if (beta > 1) delta = 1/(beta - 1);
else delta = std::numeric_limits::max(); // use winner take all
return delta;
}
/// Static call used within the constructor to set the recommended p value
static double calc_power(double beta) {
return (double) 1.0/beta;
}
double _N; ///< Number of desired jets
double _R0; ///< Jet radius
double _beta; ///< Angular exponent (beta = 2.0 is dafault, beta = 1.0 is recoil-free)
public:
};
} // namespace contrib
FASTJET_END_NAMESPACE
#endif // __FASTJET_CONTRIB_XConePlugin_HH__