// $Id$ // // Copyright (c) 2014-, Matteo Cacciari, Gavin. P. Salam and Gregory Soyez // //---------------------------------------------------------------------- // 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_SOFTKILLER_HH__ #define __FASTJET_CONTRIB_SOFTKILLER_HH__ #include #include #include "fastjet/config.h" #if FASTJET_VERSION_NUMBER >= 30100 #define FJCONTRIB_SOFTKILLER_USEFJGRID #endif #ifdef FJCONTRIB_SOFTKILLER_USEFJGRID #include "fastjet/RectangularGrid.hh" #endif FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh namespace contrib{ //------------------------------------------------------------------------ /// \class SoftKiller /// Progressively kills soft particles in order of increasing pt until /// half of the event is empty. /// /// More precisely, the event up to |rap|=rapmax is split into grid /// cells of size "cell_size". Soft particles are removed from the /// event in order of increasing pt until half the cells are empty. /// By default, that same pt cut is applied to _all_ the particles in /// the event, not just those in the grid region. /// /// If a sifter is provided, then only particles that pass the selector /// are put onto the grid, and the pt threshold is then applied just /// to those particles, while all other particles are left untouched. /// /// This is convenient, for example, if you want to apply SK just to /// neutral particles. #ifdef FJCONTRIB_SOFTKILLER_USEFJGRID class SoftKiller : public RectangularGrid { #else class SoftKiller { #endif public: /// ctor with simple initialisation /// \param rapmax the maximal absolute rapidity extent of the grid /// \param tile_size the requested grid spacing (equivalently, tile size) /// \param sifter when provided, the soft killer is applied /// only to particles that pass the sifter (the /// others are kept untouched) SoftKiller(double rapmax, double tile_size, Selector sifter = Selector()); /// ctor with more control over initialisation /// \param rapmin the minimum rapidity extent of the grid /// \param rapmax the maximum rapidity extent of the grid /// \param drap the grid spacing in rapidity /// \param dphi the grid spacing in azimuth /// \param sifter when provided, the soft killer is applied /// only to particles that pass the sifter (the /// others are kept untouched) SoftKiller(double rapmin, double rapmax, double drap, double dphi, Selector sifter = Selector()); #ifdef FJCONTRIB_SOFTKILLER_USEFJGRID /// constructor that takes RectangularGrid object to flexibly /// specify the details of the grid (works only with FJ3.1) SoftKiller(const RectangularGrid & grid, Selector sifter = Selector()); #endif /// dummy ctor (will give an unusable SoftKiller) SoftKiller(); /// returns description of the soft killer std::string description() const; /// applies the soft killer to a given event. The result is the /// "reduced" event. std::vector operator()(const std::vector & event) const{ return result(event); } /// similarly to Transformers in FastJet, introduce a 'result' /// method equivalent to the () operator. //std::vector result(const std::vector & event) const; std::vector result(const std::vector & event) const { double pt_threshold; std::vector reduced_event; apply(event, reduced_event, pt_threshold); return reduced_event; } /// alternative invocation that puts the resulting SK "reduced" event /// into the reduced_event vector, and also provides information about the /// pt threshold that was applied. /// /// The event and reduced_event must _not_ be the same variable. void apply(const std::vector & event, std::vector & reduced_event, double & pt_threshold) const; private: #ifndef FJCONTRIB_SOFTKILLER_USEFJGRID /// initial setup of the grid void _setup_grid(); // retrieve the grid cell index for a given PseudoJet inline int tile_index(const PseudoJet & p) const; inline int n_tiles() const {return _ntotal;} inline int n_good_tiles() const {return n_tiles();} inline bool tile_is_good(int itile) const {return true;} inline bool all_tiles_equal_area() const {return true;} // ctor arguments double _ymax, _ymin; ///< maximal and minimal rapidity coverage of the grid //double _cell_size; ///< grid cell size double _requested_drap; ///< requested rapidity spacing double _requested_dphi; ///< requested phi spacing // information about the grid double _dy, _dphi, _cell_area, _inverse_dy, _inverse_dphi; int _ny, _nphi, _ntotal; #endif // FJCONTRIB_SOFTKILLER_USEFJGRID Selector _sifter; ///< optional sifter }; } // namespace contrib FASTJET_END_NAMESPACE #endif // __FASTJET_CONTRIB_SOFTKILLER_HH__