// $Id: IteratedSoftDrop.cc 1084 2017-10-10 20:36:50Z gsoyez $ // // Copyright (c) 2017-, Jesse Thaler, Kevin Zhou, Gavin P. Salam // andGregory Soyez // // based on arXiv:1704.06266 by Christopher Frye, Andrew J. Larkoski, // Jesse Thaler, Kevin Zhou // //---------------------------------------------------------------------- // 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 . //---------------------------------------------------------------------- #include "IteratedSoftDrop.hh" #include #include #include using namespace std; FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh namespace contrib{ //======================================================================== // implementation of IteratedSoftDropInfo //======================================================================== // returns the angularity with angular exponent alpha and z // exponent kappa calculated on the zg's and thetag's found by // iterated SoftDrop // // returns 0 if no substructure was found double IteratedSoftDropInfo::angularity(double alpha, double kappa) const{ double sum = 0.0; for (unsigned int i=0; i< _all_zg_thetag.size(); ++i) sum += pow(_all_zg_thetag[i].first, kappa) * pow(_all_zg_thetag[i].second, alpha); return sum; } //======================================================================== // implementation of IteratedSoftDrop //======================================================================== // Constructor. Takes in the standard Soft Drop parameters, an angular cut \f$\theta_{\rm cut}\f$, // and a choice of angular and symmetry measure. // // - beta the Soft Drop beta parameter // - symmetry_cut the Soft Drop symmetry cut // - angular_cut the angular cutoff to halt Iterated Soft Drop // - R0 the angular distance normalization IteratedSoftDrop::IteratedSoftDrop(double beta, double symmetry_cut, double angular_cut, double R0, const FunctionOfPseudoJet * subtractor) : _rsd(beta, symmetry_cut, -1, R0, subtractor){ _rsd.set_hardest_branch_only(true); if (angular_cut>0) _rsd.set_min_deltaR_squared(angular_cut*angular_cut); } // Full constructor, which takes the following parameters: // // \param beta the value of the beta parameter // \param symmetry_cut the value of the cut on the symmetry measure // \param symmetry_measure the choice of measure to use to estimate the symmetry // \param angular_cut the angular cutoff to halt Iterated Soft Drop // \param R0 the angular distance normalisation [1 by default] // \param mu_cut the maximal allowed value of mass drop variable mu = m_heavy/m_parent // \param recursion_choice the strategy used to decide which subjet to recurse into // \param subtractor an optional pointer to a pileup subtractor (ignored if zero) IteratedSoftDrop::IteratedSoftDrop(double beta, double symmetry_cut, RecursiveSoftDrop::SymmetryMeasure symmetry_measure, double angular_cut, double R0, double mu_cut, RecursiveSoftDrop::RecursionChoice recursion_choice, const FunctionOfPseudoJet * subtractor) : _rsd(beta, symmetry_cut, symmetry_measure, -1, R0, mu_cut, recursion_choice, subtractor){ _rsd.set_hardest_branch_only(true); if (angular_cut>0) _rsd.set_min_deltaR_squared(angular_cut*angular_cut); } // returns vector of ISD symmetry factors and splitting angles IteratedSoftDropInfo IteratedSoftDrop::result(const PseudoJet& jet) const{ PseudoJet rsd_jet = _rsd(jet); if (! rsd_jet.has_structure_of()) return IteratedSoftDropInfo(); return IteratedSoftDropInfo(rsd_jet.structure_of().sorted_zg_and_thetag()); } std::string IteratedSoftDrop::description() const{ std::ostringstream oss; oss << "IteratedSoftDrop with beta =" << _rsd.beta() << ", symmetry_cut=" << _rsd.symmetry_cut() << ", R0=" << _rsd.R0(); if (_rsd.min_deltaR_squared() >= 0){ oss << " and angular_cut=" << sqrt(_rsd.min_deltaR_squared()); } else { oss << " and no angular_cut"; } if (_rsd.subtractor()){ oss << ", and with internal subtraction using [" << _rsd.subtractor()->description() << "]"; } return oss.str(); } } // namespace contrib FASTJET_END_NAMESPACE