// $Id$ // // Copyright (c) 2012-, Matteo Cacciari, Jihun Kim, Gavin P. Salam and Gregory Soyez // //---------------------------------------------------------------------- // This file is part of the GenericSubtractor package 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_SHAPE_WITH_COMPONENTS_HH__ #define __FASTJET_CONTRIB_SHAPE_WITH_COMPONENTS_HH__ #include "fastjet/FunctionOfPseudoJet.hh" FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh namespace contrib{ /// \class ShapeWithComponents /// base class for jet shapes that provide extra information about /// about separate components from which they are composed. /// /// Many jet shapes involve ratios or more complicated combinations of /// different components. E.g. a jet broadening is given by a ratio /// /// B = (\sum_i p_ti DeltaR_{i,jet}) / (\sum_i p_ti) /// /// The ShapeWithComponents class provides an interface that allows /// access not just to the shape but also to the individual /// components, as well as a mechanism for calculating the components /// individually and combining them back into the overall shape. This /// can be of interest, for example, in pileup subtraction, providing /// a structure to allow subtraction to be performed automatically on /// the invidividual components. /// class ShapeWithComponents : public FunctionOfPseudoJet { public: //------------------------------------------------------------------ //------- first, a reminder of the standard functions for a FoPJ --- /// the result of computing the shape from a given PseudoJet virtual double result(const PseudoJet &jet) const{ return result_from_components(components(jet)); } /// the description that has to be defined in derived classes virtual std::string description() const = 0; //------------------------------------------------------------------ //------- below, the functions that provide "hinting" -------------- /// returns the number of components virtual unsigned int n_components() const = 0; /// Returns a vector containing the different components which go /// into the calculation of the shape. The vector will be of size /// n_components(). virtual std::vector components(const PseudoJet &jet) const = 0; /// Return component i of the shape for the given jet. The numbering /// of components is 0...(n_components()-1). /// /// The default implementation of this function evaluates all /// components and then returns the requested one. Derived classes /// may wish to proceed differently. virtual double component(int i, const PseudoJet &jet) const { assert(i < int(n_components())); return components(jet)[i]; } /// given a vector of components, determine the result of the event /// shape virtual double result_from_components(const std::vector &) const = 0; /// return a pointer to a new instance of a ComponentShape that /// calculates component i of this shape. It is the caller's /// responsibility to delete the pointer when it is no longer /// needed. /// /// Note: the generic implementation included below should be adequate /// for most uses. virtual const FunctionOfPseudoJet * component_shape(unsigned index) const; /// a helper class intended to contain a single component of a /// composite shape. class ComponentShape : public FunctionOfPseudoJet { public: ComponentShape(const ShapeWithComponents * shape, unsigned index) : _shape(shape), _index(index) {} double result(const PseudoJet & jet) const { return _shape->component(_index, jet); } private: const ShapeWithComponents * _shape; const unsigned _index; }; }; /// generic implementation of component_shape -- note, this /// implementation will hide properties of component shapes, e.g. if /// the underlying shape class derives from ShapeWithPartition, the /// result of component_shape will not; If that's a problem, you /// should reimplement component_shape. inline const FunctionOfPseudoJet * ShapeWithComponents::component_shape(unsigned index) const { return new ComponentShape(this, index); } } // namespace contrib FASTJET_END_NAMESPACE #endif // __FASTJET_CONTRIB_SHAPE_WITH_COMPONENTS_HH__