// VertexJets package
// Quesstions / Comments: pascal.nef@slac.stanford.edu, sch@slac.stanford.edu
//
//
// Copyright (c) 2014
// Pascal Nef, Ariel Schwartzman
//
// $Id$
//
// Copyright (c) -,
//
//----------------------------------------------------------------------
// 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 "VertexJets.hh"
#include
#include
#include
FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh
namespace contrib{
// ---------------------------
// result method: actual worker
PseudoJet VertexJets::result(const PseudoJet &jet) const {
// first perform some checks
if (! jet.has_constituents()){
throw Error("result(): jet does not have constituents!");
}
if(_tot_n_pu_tracks <0){
throw Error("result(): tot_n_pu_tracks must be >= 0, use setter function set_tot_n_pu_tracks() to set the variable for each event");
}
if(_corrJVF_cut <-1 || _corrJVF_cut > 1){
throw Error("result(): _corrJVF_cut must be between -1 and 1, set to -1 if no cut should be applied");
}
if(_corrJVF_scale_factor <= 0){
throw Error("result(): _corrJVF_scale_factor must be > 0");
}
// either grooming_mode or tagging_mode
if(_run_mode == grooming_mode){
// use filter with SelectorIdentity() to reconstruct all area-corrected subjets
PseudoJet tmp_jet = _filter(jet);
// loop over subjets and compute corrJVF
std::vector subjets = tmp_jet.pieces();
for(unsigned int isub=0; isub < subjets.size(); ++isub){
subjets[isub] = CalculateCorrJVF(subjets[isub]);
}
// setup trimming selector, defined as MUTABLE selector
_selector_pTfracMin.set_reference(jet);
// setup combined selector: corrJVF and trimming
Selector selector_combined = _selector_corrJVF && _selector_pTfracMin;
// get subjets that pass both selectors
std::vector selected_subjets = selector_combined(subjets); // subjets that pass corrJVF cut
PseudoJet joined = join(selected_subjets, *_def_subjet.recombiner()); // recombine subjets
return joined;
}else{
PseudoJet resultjet = jet;
resultjet = CalculateCorrJVF(resultjet);
if( _selector_corrJVF.pass(resultjet) ) return resultjet; // jet passes corrJVF cut, return jet
else return resultjet*0; // jet fails corrJVF cut, return 0*jet
}
}
// ---------------------------
// Description
std::string VertexJets::description() const {
std::ostringstream ostr;
ostr << std::endl;
ostr << "VertexJets >> class for corrJVF based tagging or grooming of jets." << std::endl;
if(_run_mode == tagging_mode){
ostr << " >> running in tagging mode : corrJVF calculated for full jet" << std::endl;
}else{
ostr << " >> running in grooming mode: corrJVF calculated for subjets" << std::endl;;
}
ostr << " >> _selector_pu_ghosttracks: " << _selector_pu_ghosttracks.description() << std::endl;
ostr << " >> _selector_hs_ghosttracks: " << _selector_hs_ghosttracks.description() << std::endl;
ostr << " >> _selector_pTfracMin : " << _selector_pTfracMin.description() << std::endl;
ostr << " >> _selector_corrJVF : " << _selector_corrJVF.description() << std::endl;
ostr << " >> _def_subjet : " << _def_subjet.description() << std::endl;
if(_subtractor!=0){
ostr << " >> _subtractor : " << _subtractor->description() << std::endl;
}else{
ostr << " >> _subtractor : " << "NULL" << std::endl;
}
ostr << " >> _ghost_scale_factor : " << _ghost_scale_factor << std::endl;
ostr << " >> _tot_n_pu_tracks : " << _tot_n_pu_tracks << std::endl;
ostr << " >> _corrJVF_scale_factor : " << _corrJVF_scale_factor << std::endl;
ostr << " >> _corrJVF_cut : " << _corrJVF_cut
<< " (-1 -> no cut. Note: jets failing the cut get their momenta rescaled by 0)"
<< std::endl;
return ostr.str();
}
//-------------------------------
// CalculateCorrJVF method
PseudoJet VertexJets::CalculateCorrJVF(PseudoJet &jet) const{
// define new vector to contain PU tracks, HS tracks and other(discarded)
std::vector pu_ghost_tracks, hs_ghost_tracks, other;
// get pu tracks
_selector_pu_ghosttracks.sift(jet.constituents(), pu_ghost_tracks, other);
// get hs tracks
_selector_hs_ghosttracks.sift(jet.constituents(), hs_ghost_tracks, other);
// sum of pT of pu tracks: correct momenta for ghost scale factor (if applicable)
float pu_sum_pt = 0, hs_sum_pt = 0;
for(unsigned int it=0;it0){
corrJVF = hs_sum_pt / (hs_sum_pt + (pu_sum_pt / (std::max(1, _tot_n_pu_tracks) * _corrJVF_scale_factor) ) );
}
// create jet with VertexJetStructure structure
PseudoJet resultjet = join(jet);
StructureType *s = (StructureType *) resultjet.structure_non_const_ptr();
s->_corrJVF = corrJVF;
// and return the jet.
return resultjet;
}
//--------------------------
// Selector based on corrJVF cut
Selector VertexJets::SelectorCorrJVF(float corrJVF_cut) {
return new SelectorWorkerCorrJVF(corrJVF_cut);
}
} // namespace contrib
FASTJET_END_NAMESPACE