11#ifndef HEPMC3_FEATURE_H
12#define HEPMC3_FEATURE_H
55template<
typename Feature_type>
60 using Evaluator_type = std::function<Feature_type(ConstGenParticlePtr)>;
61 using EvaluatorPtr = std::shared_ptr<Evaluator_type>;
64 Feature_type
operator()(ConstGenParticlePtr input)
const {
65 return (*m_internal)(input);
71 EvaluatorPtr functor = m_internal;
72 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) > value;};
77 EvaluatorPtr functor = m_internal;
78 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) < value;};
84 EvaluatorPtr functor = m_internal;
85 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) >= value;};
91 EvaluatorPtr functor = m_internal;
92 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) <= value;};
98 EvaluatorPtr functor = m_internal;
99 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) == value;};
105 EvaluatorPtr functor = m_internal;
106 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) != value;};
112 GenericFeature(Evaluator_type functor):m_internal(std::make_shared<Evaluator_type>(functor)) {}
120 EvaluatorPtr m_internal;
160template<
typename Feature_type,
typename Dummy=
void>
165 using typename GenericFeature<Feature_type>::Evaluator_type;
166 using typename GenericFeature<Feature_type>::EvaluatorPtr;
181 EvaluatorPtr functor = m_internal;
182 Evaluator_type absfunctor = [functor](ConstGenParticlePtr p)->Feature_type{
return ::abs((*functor)(p));};
203template<
typename Feature_type>
204class Feature<Feature_type, typename std::enable_if<std::is_integral<Feature_type>::value, void>::type> :
public GenericFeature<Feature_type> {
216 using typename GenericFeature<Feature_type>::Evaluator_type;
217 using typename GenericFeature<Feature_type>::EvaluatorPtr;
225 EvaluatorPtr functor = m_internal;
226 Evaluator_type absfunctor = [functor](ConstGenParticlePtr p)->Feature_type{
return ::abs((*functor)(p));};
231 EvaluatorPtr functor = m_internal;
232 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) > value;};
236 EvaluatorPtr functor = m_internal;
237 return [value, functor](ConstGenParticlePtr input)->
bool{
return (*functor)(input) < value;};
241 EvaluatorPtr functor = m_internal;
242 return [value, functor](ConstGenParticlePtr input)->
bool{
243 Feature_type local = (*functor)(input);
244 return fabs(local - value) <= ((::abs(local) < fabs(value))? fabs(value) : ::abs(local)) * std::numeric_limits<double>::epsilon();
253 return !( (*this)==value );
267template<
typename Feature_type>
268class Feature<Feature_type, typename std::enable_if<std::is_floating_point<Feature_type>::value, void>::type> :
public GenericFeature<Feature_type> {
272 using typename GenericFeature<Feature_type>::Evaluator_type;
273 using typename GenericFeature<Feature_type>::EvaluatorPtr;
287 EvaluatorPtr functor = m_internal;
288 Evaluator_type absfunctor = [functor](ConstGenParticlePtr p)->Feature_type{
return fabs((*functor)(p));};
293 EvaluatorPtr functor = m_internal;
294 return [value, functor](ConstGenParticlePtr input)->
bool{
295 Feature_type local = (*functor)(input);
296 return std::less_equal<Feature_type>{}(fabs(local - value) , std::numeric_limits<Feature_type>::epsilon());
301 return !( (*this)==value );
315template<
typename Feature_type>
Defines Filter operations for combingin Filters.
Definition of class GenParticle.
Expose GenericFeature interface to derived Feature class.
GenericFeature defines the Feature interface GenericFeature is not intended to be used directly....
Filter operator>(Feature_type value) const
greater than operator
Filter operator<(Feature_type value) const
less than operator
Filter operator>=(Feature_type value) const
greater than or equals operator
virtual Filter operator!=(Feature_type value) const
inequality operator
GenericFeature(const GenericFeature ©)
Hide the copy constructor.
Feature_type operator()(ConstGenParticlePtr input) const
access the underlying feature value
virtual Filter operator==(Feature_type value) const
equality operator
Filter operator<=(Feature_type value) const
less than or equals operator
GenericFeature(Evaluator_type functor)
Hide the constructor so no one can use GenericFeature directly.
std::function< bool(ConstGenParticlePtr)> Filter
type of Filter
Feature< Feature_type > abs(const Feature< Feature_type > &input)
Obtain the absolute value of a Feature. This works as you'd expect. If foo is a valid Feature,...