// ConstituentSubtractor package // Questions/comments: peter.berta@cern.ch, Martin.Spousta@cern.ch, David.W.Miller@uchicago.edu, Rupert.Leitner@mff.cuni.cz // Copyright (c) 2014-, Peter Berta, Martin Spousta, David W. Miller, Rupert Leitner // //---------------------------------------------------------------------- // 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 "RescalingClasses.hh" FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh namespace contrib{ ///----------------------------------------------------- /// BackgroundRescalingYPhi BackgroundRescalingYPhi::BackgroundRescalingYPhi(double v2, double v3, double v4, double psi, double a1, double sigma1, double a2, double sigma2){ _v2=v2; _v3=v3; _v4=v4; _psi=psi; _a1=a1; _sigma1=sigma1; _a2=a2; _sigma2=sigma2; _use_rap=true; _use_phi=true; } void BackgroundRescalingYPhi::use_rap_term(bool use_rap){ _use_rap=use_rap; } void BackgroundRescalingYPhi::use_phi_term(bool use_phi){ _use_phi=use_phi; } double BackgroundRescalingYPhi::result(const PseudoJet & particle) const { double phi_term=1; if (_use_phi){ double phi=particle.phi(); phi_term=1 + 2*_v2*_v2*cos(2*(phi-_psi)) + 2*_v3*_v3*cos(3*(phi-_psi)) + 2*_v4*_v4*cos(4*(phi-_psi)); } double rap_term=1; if (_use_rap){ double y=particle.rap(); rap_term=_a1*exp(-y*y/(2*_sigma1*_sigma1)) + _a2*exp(-y*y/(2*_sigma2*_sigma2)); } return phi_term*rap_term; } ///---------------------------------------------------- /// BackgroundRescalingYPhiUsingVectorForY BackgroundRescalingYPhiUsingVectorForY::BackgroundRescalingYPhiUsingVectorForY(double v2, double v3, double v4, double psi, std::vector values, std::vector rap_binning, bool interpolate){ _v2=v2; _v3=v3; _v4=v4; _psi=psi; _values=values; _rap_binning=rap_binning; _use_phi=true; _interpolate=interpolate; if (_rap_binning.size()>=2){ _use_rap=true; if (_values.size()!=_rap_binning.size()-1) throw Error("BackgroundRescalingYPhiUsingVectorForY (from ConstituentSubtractor) The input vectors have wrong dimension. The vector with binning shuld have the size by one higher than the vector with values."); } else _use_rap=false; } void BackgroundRescalingYPhiUsingVectorForY::use_rap_term(bool use_rap){ _use_rap=use_rap; if (use_rap && _rap_binning.size()<2) throw Error("BackgroundRescalingYPhiUsingVectorForY (from ConstituentSubtractor) Requested rapidity rescaling, but the vector with binning has less than two elements!"); } void BackgroundRescalingYPhiUsingVectorForY::use_phi_term(bool use_phi){ _use_phi=use_phi; } double BackgroundRescalingYPhiUsingVectorForY::result(const PseudoJet & particle) const { double phi_term=1; if (_use_phi){ double phi=particle.phi(); phi_term=1 + 2*_v2*_v2*cos(2*(phi-_psi)) + 2*_v3*_v3*cos(3*(phi-_psi)) + 2*_v4*_v4*cos(4*(phi-_psi)); } unsigned int nBins=_rap_binning.size()-1; double rap_term=1; if (_use_rap){ int rap_index=0; double rap=particle.rap(); if (rap<_rap_binning[0]) rap_index=0; // take the lowest rapidity bin in this case else if (rap>=_rap_binning[nBins]) rap_index=nBins-1; // take the highest rapidity bin in this case else{ for (unsigned int i=1;i=(_rap_binning[nBins-1]+_rap_binning[nBins])/2.) rap_term=_values[nBins-1]; else{ double value_low,value_high,rap_bin_low,rap_bin_high; double rap_bin_center=(_rap_binning[rap_index]+_rap_binning[rap_index+1])/2.; if (rap > values, std::vector rap_binning, std::vector phi_binning){ _values=values; _rap_binning=rap_binning; _phi_binning=phi_binning; if (_rap_binning.size()>=2) _use_rap=true; else _use_rap=false; if (_phi_binning.size()>=2) _use_phi=true; else _use_phi=false; } void BackgroundRescalingYPhiUsingVectors::use_rap_term(bool use_rap){ _use_rap=use_rap; if (use_rap && _rap_binning.size()<2) throw Error("BackgroundRescalingYPhiUsingVectors (from ConstituentSubtractor) Requested rapidity rescaling, but the vector with binning has less than two elements!"); } void BackgroundRescalingYPhiUsingVectors::use_phi_term(bool use_phi){ _use_phi=use_phi; if (use_phi && _phi_binning.size()<2) throw Error("BackgroundRescalingYPhiUsingVectors (from ConstituentSubtractor) Requested azimuth rescaling, but the vector with binning has less than two elements!"); } double BackgroundRescalingYPhiUsingVectors::result(const PseudoJet & particle) const { unsigned int phi_index=0; if (_use_phi){ double phi=particle.phi(); if (phi<_phi_binning[0] || phi>=_phi_binning[_phi_binning.size()-1]) throw Error("BackgroundRescalingYPhiUsingVectors (from ConstituentSubtractor) The phi binning does not correspond to the phi binning of the particles."); for (unsigned int i=1;i<_phi_binning.size();++i){ if (phi<_phi_binning[i]){ phi_index=i-1; break; } } } unsigned int rap_index=0; if (_use_rap){ double rap=particle.rap(); if (rap<_rap_binning[0]) rap_index=0; // take the lowest rapidity bin in this case else if (rap>=_rap_binning[_rap_binning.size()-1]) rap_index=_rap_binning.size()-2; // take the highest rapidity bin in this case else{ for (unsigned int i=1;i<_rap_binning.size();++i){ if (rap<_rap_binning[i]){ rap_index=i-1; break; } } } } if (_values.size()<=rap_index) throw Error("BackgroundRescalingYPhiUsingVectors (from ConstituentSubtractor) The input vector > with values has wrong size."); else if (_values[rap_index].size()<=phi_index) throw Error("BackgroundRescalingYPhiUsingVectors (from ConstituentSubtractor) The input vector > with values has wrong size."); return _values[rap_index][phi_index]; } } // namespace contrib FASTJET_END_NAMESPACE