#ifndef __FASTJET_LAZYTILING25_HH__
#define __FASTJET_LAZYTILING25_HH__
// #define INSTRUMENT2 1
//FJSTARTHEADER
// $Id: LazyTiling25.hh 4442 2020-05-05 07:50:11Z soyez $
//
// Copyright (c) 2005-2020, Matteo Cacciari, Gavin P. Salam and Gregory Soyez
//
//----------------------------------------------------------------------
// This file is part of FastJet.
//
// FastJet 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.
//
// The algorithms that underlie FastJet have required considerable
// development. They are described in the original FastJet paper,
// hep-ph/0512210 and in the manual, arXiv:1111.6097. If you use
// FastJet as part of work towards a scientific publication, please
// quote the version you use and include a citation to the manual and
// optionally also to hep-ph/0512210.
//
// FastJet 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 FastJet. If not, see .
//----------------------------------------------------------------------
//FJENDHEADER
//#include "fastjet/PseudoJet.hh"
#include "fastjet/internal/MinHeap.hh"
#include "fastjet/ClusterSequence.hh"
#include "fastjet/internal/LazyTiling9Alt.hh"
#include "fastjet/internal/LazyTiling9.hh"
FASTJET_BEGIN_NAMESPACE // defined in fastjet/internal/base.hh
typedef Tile2Base<25> Tile25;
// class Tile25 {
// public:
// /// pointers to neighbouring tiles, including self
// Tile25 * begin_tiles[25];
// /// neighbouring tiles, excluding self
// Tile25 ** surrounding_tiles;
// /// half of neighbouring tiles, no self
// Tile25 ** RH_tiles;
// /// just beyond end of tiles
// Tile25 ** end_tiles;
// /// start of list of BriefJets contained in this tile
// TiledJet * head;
// /// sometimes useful to be able to tag a tile
// bool tagged;
// /// for all particles in the tile, this stores the largest of the
// /// (squared) nearest-neighbour distances.
// double max_NN_dist;
// double eta_centre, phi_centre;
//
// bool is_near_zero_phi(double tile_size_phi) const {
// return phi_centre < 2*tile_size_phi || (twopi-phi_centre) < 2*tile_size_phi;
// }
// };
//----------------------------------------------------------------------
class LazyTiling25 {
public:
LazyTiling25(ClusterSequence & cs);
void run();
protected:
ClusterSequence & _cs;
const std::vector & _jets;
std::vector _tiles;
#ifdef INSTRUMENT2
int _ncall; // GPS tmp
int _ncall_dtt; // GPS tmp
#endif // INSTRUMENT2
double _Rparam, _R2, _invR2;
double _tiles_eta_min, _tiles_eta_max;
double _tile_size_eta, _tile_size_phi;
double _tile_half_size_eta, _tile_half_size_phi;
int _n_tiles_phi,_tiles_ieta_min,_tiles_ieta_max;
std::vector _jets_for_minheap;
//MinHeap _minheap;
void _initialise_tiles();
// reasonably robust return of tile index given ieta and iphi, in particular
// it works even if iphi is negative
inline int _tile_index (int ieta, int iphi) const {
// note that (-1)%n = -1 so that we have to add _n_tiles_phi
// before performing modulo operation
return (ieta-_tiles_ieta_min)*_n_tiles_phi
+ (iphi+_n_tiles_phi) % _n_tiles_phi;
}
void _bj_remove_from_tiles(TiledJet * const jet);
/// returns the tile index given the eta and phi values of a jet
int _tile_index(const double eta, const double phi) const;
// sets up information regarding the tiling of the given jet
void _tj_set_jetinfo(TiledJet * const jet, const int _jets_index);
void _print_tiles(TiledJet * briefjets ) const;
void _add_neighbours_to_tile_union(const int tile_index,
std::vector & tile_union, int & n_near_tiles) const;
void _add_untagged_neighbours_to_tile_union(const int tile_index,
std::vector & tile_union, int & n_near_tiles);
void _add_untagged_neighbours_to_tile_union_using_max_info(const TiledJet * const jet,
std::vector & tile_union, int & n_near_tiles);
double _distance_to_tile(const TiledJet * bj, const Tile25 *)
#ifdef INSTRUMENT2
;
#else
const;
#endif
void _update_jetX_jetI_NN(TiledJet * jetX, TiledJet * jetI, std::vector & jets_for_minheap);
void _set_NN(TiledJet * jetI, std::vector & jets_for_minheap);
// return the diJ (multiplied by _R2) for this jet assuming its NN
// info is correct
template double _bj_diJ(const J * const jet) const {
double kt2 = jet->kt2;
if (jet->NN != NULL) {if (jet->NN->kt2 < kt2) {kt2 = jet->NN->kt2;}}
return jet->NN_dist * kt2;
}
//----------------------------------------------------------------------
template inline void _bj_set_jetinfo(
J * const jetA, const int _jets_index) const {
jetA->eta = _jets[_jets_index].rap();
jetA->phi = _jets[_jets_index].phi_02pi();
jetA->kt2 = _cs.jet_scale_for_algorithm(_jets[_jets_index]);
jetA->_jets_index = _jets_index;
// initialise NN info as well
jetA->NN_dist = _R2;
jetA->NN = NULL;
}
//----------------------------------------------------------------------
template inline double _bj_dist(
const J * const jetA, const J * const jetB)
#ifdef INSTRUMENT2
{
_ncall++; // GPS tmp
#else
const {
#endif
double dphi = std::abs(jetA->phi - jetB->phi);
double deta = (jetA->eta - jetB->eta);
if (dphi > pi) {dphi = twopi - dphi;}
return dphi*dphi + deta*deta;
}
//----------------------------------------------------------------------
template inline double _bj_dist_not_periodic(
const J * const jetA, const J * const jetB)
#ifdef INSTRUMENT2
{
_ncall++; // GPS tmp
#else
const {
#endif
//_ncall++; // GPS tmp
double dphi = jetA->phi - jetB->phi;
double deta = (jetA->eta - jetB->eta);
return dphi*dphi + deta*deta;
}
};
FASTJET_END_NAMESPACE
#endif // __FASTJET_LAZYTILING25_HH__