// Nsubjettiness Package
// Questions/Comments? jthaler@jthaler.net
//
// Copyright (c) 2011-14
// Jesse Thaler, Ken Van Tilburg, Christopher K. Vermilion, and TJ Wilkason
//
// $Id: NjettinessDefinition.hh 704 2014-07-07 14:30:43Z 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_NJETTINESS_DEFINITION_HH__
#define __FASTJET_CONTRIB_NJETTINESS_DEFINITION_HH__
#include "MeasureFunction.hh"
#include "AxesFinder.hh"
#include "fastjet/PseudoJet.hh"
#include
#include
#include
#include
#include
FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh
namespace contrib {
// Eventually this file might contains an NjettinessDefinition that combines an
// AxesDefinition with a MeasureDefinition. It's not clear how useful that would be, though
// The following Measures are available (and the relevant arguments):
class NormalizedMeasure; // (beta,R0)
class UnnormalizedMeasure; // (beta)
class GeometricMeasure; // (beta)
class NormalizedCutoffMeasure; // (beta,R0,Rcutoff)
class UnnormalizedCutoffMeasure; // (beta,Rcutoff)
class GeometricCutoffMeasure; // (beta,Rcutoff)
// The following Axes are available (and the relevant arguments, if needed)
class KT_Axes;
class CA_Axes;
class AntiKT_Axes; // (R0)
class WTA_KT_Axes;
class WTA_CA_Axes;
class Manual_Axes;
class OnePass_KT_Axes;
class OnePass_CA_Axes;
class OnePass_AntiKT_Axes; // (R0)
class OnePass_WTA_KT_Axes;
class OnePass_WTA_CA_Axes;
class OnePass_Manual_Axes;
class MultiPass_Axes;
// Below are just technical implementations of the variable axes and measures.
///////
//
// MeasureDefinition
//
///////
//The MeasureDefinition is a way to set the MeasureMode and
//parameters used by Njettiness, with errors in the number of parameters given at
//compile time (instead of at run time). The MeasureDefintion knows which core objects
//to call to make the measurement, as well as properties of the MeasureFunction
class MeasureDefinition {
public:
// Description of measure and parameters
virtual std::string description() const = 0;
// In derived classes, this should return a copy of the corresponding
// derived class
virtual MeasureDefinition* create() const = 0;
//Return the MeasureFunction corresponding to this definition
virtual MeasureFunction* createMeasureFunction() const = 0;
//Return the AxesFinder that should be used for one-pass minimization
virtual AxesFinder* createOnePassAxesFinder() const = 0;
//Specify whether multi-pass minimization makes sense, and if so, return the AxesFinder that should be used for multi-pass minimization
virtual bool supportsMultiPassMinimization() const = 0;
virtual AxesFinder* createMultiPassAxesFinder( unsigned int) const = 0;
virtual ~MeasureDefinition(){};
};
// The normalized measure, with two parameters: beta and R0
class NormalizedMeasure : public MeasureDefinition {
public:
NormalizedMeasure(double beta, double R0)
: _beta(beta), _R0(R0) {}
virtual std::string description() const;
virtual MeasureFunction* createMeasureFunction() const {
return (new DefaultNormalizedMeasureFunction(_beta,_R0,std::numeric_limits::max()));
}
virtual NormalizedMeasure* create() const {return new NormalizedMeasure(*this);}
virtual AxesFinder* createOnePassAxesFinder() const {
return (new AxesFinderFromOnePassMinimization(_beta, std::numeric_limits::max()));
}
virtual AxesFinder* createMultiPassAxesFinder( unsigned int Npass) const {
return (new AxesFinderFromKmeansMinimization(_beta, std::numeric_limits::max(),Npass));
}
virtual bool supportsMultiPassMinimization() const { return true; }
private:
double _beta;
double _R0;
};
// The unnormalized measure, with just one parameter: beta
class UnnormalizedMeasure : public MeasureDefinition {
public:
UnnormalizedMeasure(double beta)
: _beta(beta) {}
virtual UnnormalizedMeasure* create() const {return new UnnormalizedMeasure(*this);}
virtual std::string description() const;
virtual MeasureFunction* createMeasureFunction() const {
return (new DefaultUnnormalizedMeasureFunction(_beta,std::numeric_limits::max()));
}
virtual AxesFinder* createOnePassAxesFinder() const {
return (new AxesFinderFromOnePassMinimization(_beta, std::numeric_limits::max()));
}
virtual AxesFinder* createMultiPassAxesFinder( unsigned int Npass) const {
return (new AxesFinderFromKmeansMinimization(_beta, std::numeric_limits::max(),Npass));
}
virtual bool supportsMultiPassMinimization() const { return true; }
private:
double _beta;
};
// The geometric measure, with 1 parameter: beta
// This measure is still evolving and shouldn't be used for any critial applications yet
class GeometricMeasure : public MeasureDefinition {
public:
GeometricMeasure(double beta)
: _beta(beta) {}
virtual GeometricMeasure* create() const {return new GeometricMeasure(*this);}
virtual std::string description() const;
virtual MeasureFunction* createMeasureFunction() const {
return (new GeometricMeasureFunction(_beta,std::numeric_limits::max()));
}
virtual AxesFinder* createOnePassAxesFinder() const {
return (new AxesFinderFromGeometricMinimization(_beta, std::numeric_limits::max()));
}
virtual AxesFinder* createMultiPassAxesFinder(unsigned int) const {
throw Error("GeometricMeasure does not support multi-pass minimization.");
return NULL;
}
virtual bool supportsMultiPassMinimization() const { return false; }
private:
double _beta;
};
// The normalized cutoff measure, with 3 parameters: beta, R0, Rcutoff
class NormalizedCutoffMeasure : public MeasureDefinition {
public:
NormalizedCutoffMeasure(double beta, double R0, double Rcutoff)
: _beta(beta), _R0(R0), _Rcutoff(Rcutoff) {}
virtual std::string description() const;
virtual NormalizedCutoffMeasure* create() const {return new NormalizedCutoffMeasure(*this);}
virtual MeasureFunction* createMeasureFunction() const {
return (new DefaultNormalizedMeasureFunction(_beta,_R0,_Rcutoff));
}
virtual AxesFinder* createOnePassAxesFinder() const {
return (new AxesFinderFromOnePassMinimization(_beta, _Rcutoff));
}
virtual AxesFinder* createMultiPassAxesFinder( unsigned int Npass) const {
return (new AxesFinderFromKmeansMinimization(_beta, std::numeric_limits::max(),Npass));
}
virtual bool supportsMultiPassMinimization() const { return true; }
private:
double _beta;
double _R0;
double _Rcutoff;
};
// The unnormalized cutoff measure, with 2 parameters: beta, Rcutoff
class UnnormalizedCutoffMeasure : public MeasureDefinition {
public:
UnnormalizedCutoffMeasure(double beta, double Rcutoff)
: _beta(beta), _Rcutoff(Rcutoff) {}
virtual std::string description() const;
virtual UnnormalizedCutoffMeasure* create() const {return new UnnormalizedCutoffMeasure(*this);}
virtual MeasureFunction* createMeasureFunction() const {
return (new DefaultUnnormalizedMeasureFunction(_beta,_Rcutoff));
}
virtual AxesFinder* createOnePassAxesFinder() const {
return (new AxesFinderFromOnePassMinimization(_beta, _Rcutoff));
}
virtual AxesFinder* createMultiPassAxesFinder( unsigned int Npass) const {
return (new AxesFinderFromKmeansMinimization(_beta, std::numeric_limits::max(),Npass));
}
virtual bool supportsMultiPassMinimization() const { return true; }
private:
double _beta;
double _Rcutoff;
};
// The Geometric measure, with 2 parameters: beta, Rcutoff
// This measure is still evolving and shouldn't be used for any critial applications yet
class GeometricCutoffMeasure : public MeasureDefinition {
public:
GeometricCutoffMeasure(double beta, double Rcutoff)
: _beta(beta), _Rcutoff(Rcutoff) {}
virtual GeometricCutoffMeasure* create() const {return new GeometricCutoffMeasure(*this);}
virtual std::string description() const;
virtual MeasureFunction* createMeasureFunction() const {
return (new GeometricMeasureFunction(_beta,_Rcutoff));
}
virtual AxesFinder* createOnePassAxesFinder() const {
return (new AxesFinderFromGeometricMinimization(_beta, _Rcutoff));
}
virtual AxesFinder* createMultiPassAxesFinder(unsigned int) const {
throw Error("GeometricCutoffMeasure does not support multi-pass minimization.");
return NULL;
}
virtual bool supportsMultiPassMinimization() const { return false; }
private:
double _beta;
double _Rcutoff;
};
///////
//
// AxesDefinition
//
///////
//Analogous to MeasureDefinition, AxesDefinition defines which AxesFinder to use
//At the moment, most AxesDefinition do not have an arugment (except the Anti-KT ones)
class AxesDefinition {
public:
// description of axes (and any parameters)
virtual std::string short_description() const = 0;
virtual std::string description() const = 0;
// In derived classes, this should return a copy of the corresponding
// derived class
virtual AxesDefinition* create() const = 0;
// These describe how the axes finder works
virtual bool givesRandomizedResults() const = 0;
virtual bool supportsManualAxes() const = 0;
//for best testing
virtual AxesFinder* createStartingAxesFinder(const MeasureDefinition &) const = 0;
virtual AxesFinder* createFinishingAxesFinder(const MeasureDefinition &) const {
return NULL; //By default, nothing.
};
virtual ~AxesDefinition() {};
};
// kt axes
class KT_Axes : public AxesDefinition {
public:
KT_Axes() {}
virtual std::string short_description() const {
return "KT";
};
virtual std::string description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "KT Axes";
return stream.str();
};
virtual KT_Axes* create() const {return new KT_Axes(*this);}
virtual bool givesRandomizedResults() const {return false;}
virtual bool supportsManualAxes() const {return false;}
virtual AxesFinder* createStartingAxesFinder(const MeasureDefinition &) const {
return (new AxesFinderFromKT());
}
};
// ca axes
class CA_Axes : public AxesDefinition {
public:
CA_Axes() {}
virtual std::string short_description() const {
return "CA";
};
virtual std::string description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "CA Axes";
return stream.str();
};
virtual CA_Axes* create() const {return new CA_Axes(*this);}
virtual bool givesRandomizedResults() const {return false;}
virtual bool supportsManualAxes() const {return false;}
virtual AxesFinder* createStartingAxesFinder(const MeasureDefinition &) const {
return (new AxesFinderFromCA());
}
};
// anti-kt axes, one parameter R0 is subjet radius
class AntiKT_Axes : public AxesDefinition {
public:
AntiKT_Axes(double R0 = 0.2): _R0(R0) {}
virtual std::string short_description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "AKT" << _R0;
return stream.str();
};
virtual std::string description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "Anti-KT Axes (R0 = " << _R0 << ")";
return stream.str();
};
virtual AntiKT_Axes* create() const {return new AntiKT_Axes(*this);}
virtual bool givesRandomizedResults() const {return false;}
virtual bool supportsManualAxes() const {return false;}
virtual AxesFinder* createStartingAxesFinder(const MeasureDefinition &) const {
return (new AxesFinderFromAntiKT(_R0));
}
private:
double _R0;
};
// winner-take-all recombination with kt axes
class WTA_KT_Axes : public AxesDefinition {
public:
WTA_KT_Axes() {}
virtual std::string short_description() const {
return "WTA KT";
};
virtual std::string description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "Winner-Take-All KT Axes";
return stream.str();
};
virtual WTA_KT_Axes* create() const {return new WTA_KT_Axes(*this);}
virtual bool givesRandomizedResults() const {return false;}
virtual bool supportsManualAxes() const {return false;}
virtual AxesFinder* createStartingAxesFinder(const MeasureDefinition &) const {
return (new AxesFinderFromWTA_KT());
}
};
// winner-take-all recombination with CA axes
class WTA_CA_Axes : public AxesDefinition {
public:
WTA_CA_Axes() {}
virtual std::string short_description() const {
return "WTA CA";
};
virtual std::string description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "Winner-Take-All CA Axes";
return stream.str();
};
virtual WTA_CA_Axes* create() const {return new WTA_CA_Axes(*this);}
virtual bool givesRandomizedResults() const {return false;}
virtual bool supportsManualAxes() const {return false;}
virtual AxesFinder* createStartingAxesFinder(const MeasureDefinition &) const {
return (new AxesFinderFromWTA_CA());
}
};
// Onepass minimization from kt axes
class OnePass_KT_Axes : public AxesDefinition {
public:
OnePass_KT_Axes() {}
virtual std::string short_description() const {
return "OnePass KT";
};
virtual std::string description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "One-Pass Minimization from KT Axes";
return stream.str();
};
virtual OnePass_KT_Axes* create() const {return new OnePass_KT_Axes(*this);}
virtual bool givesRandomizedResults() const {return false;}
virtual bool supportsManualAxes() const {return false;}
virtual AxesFinder* createStartingAxesFinder(const MeasureDefinition & ) const {
return (new AxesFinderFromKT());
}
virtual AxesFinder* createFinishingAxesFinder(const MeasureDefinition & measure_def) const {
return measure_def.createOnePassAxesFinder();
}
};
// Onepass minimization from CA axes
class OnePass_CA_Axes : public AxesDefinition {
public:
OnePass_CA_Axes() {}
virtual std::string short_description() const {
return "OnePass CA";
};
virtual std::string description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "One-Pass Minimization from CA Axes";
return stream.str();
};
virtual OnePass_CA_Axes* create() const {return new OnePass_CA_Axes(*this);}
virtual bool givesRandomizedResults() const {return false;}
virtual bool supportsManualAxes() const {return false;}
virtual AxesFinder* createStartingAxesFinder(const MeasureDefinition & ) const {
return (new AxesFinderFromCA());
}
virtual AxesFinder* createFinishingAxesFinder(const MeasureDefinition & measure_def) const {
return measure_def.createOnePassAxesFinder();
}
};
// Onepass minimization from AntiKT axes, one parameter R0
class OnePass_AntiKT_Axes : public AxesDefinition {
public:
OnePass_AntiKT_Axes(double R0): _R0(R0) {}
virtual std::string short_description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "OnePassAKT" << _R0;
return stream.str();
};
virtual std::string description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "One-Pass Minimization from Anti-KT Axes (R0 = " << _R0 << ")";
return stream.str();
};
virtual OnePass_AntiKT_Axes* create() const {return new OnePass_AntiKT_Axes(*this);}
virtual bool givesRandomizedResults() const {return false;}
virtual bool supportsManualAxes() const {return false;}
virtual AxesFinder* createStartingAxesFinder(const MeasureDefinition & ) const {
return (new AxesFinderFromAntiKT(_R0));
}
virtual AxesFinder* createFinishingAxesFinder(const MeasureDefinition & measure_def) const {
return measure_def.createOnePassAxesFinder();
}
private:
double _R0;
};
// Onepass minimization from winner-take-all kt axes
class OnePass_WTA_KT_Axes : public AxesDefinition {
public:
OnePass_WTA_KT_Axes() {}
virtual std::string short_description() const {
return "OnePass WTA KT";
};
virtual std::string description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "One-Pass Minimization from Winner-Take-All KT Axes";
return stream.str();
};
virtual OnePass_WTA_KT_Axes* create() const {return new OnePass_WTA_KT_Axes(*this);}
virtual bool givesRandomizedResults() const {return false;}
virtual bool supportsManualAxes() const {return false;}
virtual AxesFinder* createStartingAxesFinder(const MeasureDefinition & ) const {
return (new AxesFinderFromWTA_KT());
}
virtual AxesFinder* createFinishingAxesFinder(const MeasureDefinition & measure_def) const {
return measure_def.createOnePassAxesFinder();
}
};
// Onepass minimization from winner-take-all CA axes
class OnePass_WTA_CA_Axes : public AxesDefinition {
public:
OnePass_WTA_CA_Axes() {}
virtual std::string short_description() const {
return "OnePass WTA CA";
};
virtual std::string description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "One-Pass Minimization from Winner-Take-All CA Axes";
return stream.str();
};
virtual OnePass_WTA_CA_Axes* create() const {return new OnePass_WTA_CA_Axes(*this);}
virtual bool givesRandomizedResults() const {return false;}
virtual bool supportsManualAxes() const {return false;}
virtual AxesFinder* createStartingAxesFinder(const MeasureDefinition & ) const {
return (new AxesFinderFromWTA_CA());
}
virtual AxesFinder* createFinishingAxesFinder(const MeasureDefinition & measure_def) const {
return measure_def.createOnePassAxesFinder();
}
};
// set axes manually
class Manual_Axes : public AxesDefinition {
public:
Manual_Axes() {}
virtual std::string short_description() const {
return "Manual";
};
virtual std::string description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "Manual Axes";
return stream.str();
};
virtual Manual_Axes* create() const {return new Manual_Axes(*this);}
virtual bool givesRandomizedResults() const {return false;}
virtual bool supportsManualAxes() const {return true;}
virtual AxesFinder* createStartingAxesFinder(const MeasureDefinition &) const {
return (new AxesFinderFromUserInput());
}
};
// one pass minimization from manual starting point
class OnePass_Manual_Axes : public AxesDefinition {
public:
OnePass_Manual_Axes() {}
virtual std::string short_description() const {
return "OnePass Manual";
};
virtual std::string description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "One-Pass Minimization from Manual Axes";
return stream.str();
};
virtual OnePass_Manual_Axes* create() const {return new OnePass_Manual_Axes(*this);}
virtual bool givesRandomizedResults() const {return false;}
virtual bool supportsManualAxes() const {return true;}
virtual AxesFinder* createStartingAxesFinder(const MeasureDefinition & ) const {
return (new AxesFinderFromUserInput());
}
virtual AxesFinder* createFinishingAxesFinder(const MeasureDefinition & measure_def) const {
return measure_def.createOnePassAxesFinder();
}
};
// multi-pass minimization from kT starting point
class MultiPass_Axes : public AxesDefinition {
public:
MultiPass_Axes(unsigned int Npass) : _Npass(Npass) {}
virtual std::string short_description() const {
return "MultiPass";
};
virtual std::string description() const {
std::stringstream stream;
stream << std::fixed << std::setprecision(2)
<< "Multi-Pass Axes (Npass = " << _Npass << ")";
return stream.str();
};
virtual MultiPass_Axes* create() const {return new MultiPass_Axes(*this);}
virtual bool givesRandomizedResults() const {return true;}
virtual bool supportsManualAxes() const {return false;}
virtual AxesFinder* createStartingAxesFinder(const MeasureDefinition & ) const {
return (new AxesFinderFromKT());
}
virtual AxesFinder* createFnishingAxesFinder(const MeasureDefinition & measure_def) const {
return measure_def.createMultiPassAxesFinder(_Npass);
}
private:
unsigned int _Npass;
};
} // namespace contrib
FASTJET_END_NAMESPACE
#endif // __FASTJET_CONTRIB_NJETTINESS_HH__