1#ifndef __FASTJET_NNFJN2PLAIN_HH__ 
    2#define __FASTJET_NNFJN2PLAIN_HH__ 
   34#include "fastjet/NNBase.hh" 
   36FASTJET_BEGIN_NAMESPACE      
 
  103  NNFJN2Plain(
const std::vector<PseudoJet> & jets, I * info) : 
NNBase<I>(info) {start(jets);}
 
  106  virtual void start(
const std::vector<PseudoJet> & jets);
 
  110  double dij_min(
int & iA, 
int & iB);
 
  113  void remove_jet(
int iA);
 
  117  void merge_jets(
int iA, 
int iB, 
const PseudoJet & jet, 
int jet_index);
 
  129  inline double compute_diJ(
const NNBJ * 
const jet)
 const {
 
  130    double mom_fact = jet->momentum_factor();
 
  131    if (jet->NN != NULL) {
 
  132      double other_mom_fact = jet->NN->momentum_factor();
 
  133      if (other_mom_fact < mom_fact) {mom_fact = other_mom_fact;}
 
  135    return jet->NN_dist * mom_fact;
 
  141  void set_NN_crosscheck(NNBJ * jet, NNBJ * begin, NNBJ * end);
 
  145  void set_NN_nocross   (NNBJ * jet, NNBJ * begin, NNBJ * end);
 
  157  std::vector<NNBJ *> where_is;
 
  164  class NNBJ : 
public BJ {
 
  166    void init(
const PseudoJet & jet, 
int index_in) {
 
  168      other_init(index_in);
 
  170    void init(
const PseudoJet & jet, 
int index_in, I * info) {
 
  172      other_init(index_in);
 
  174    void other_init(
int index_in) {
 
  176      NN_dist = BJ::geometrical_beam_distance();
 
  179    int index()
 const {
return _index;}
 
  195  briefjets = 
new NNBJ[n];
 
  196  where_is.resize(2*n);
 
  198  NNBJ * jetA = briefjets;
 
  201  for (
int i = 0; i< n; i++) {
 
  204    this->init_jet(jetA, jets[i], i);
 
  213  for (jetA = head + 1; jetA != tail; jetA++) {
 
  217    set_NN_crosscheck(jetA, head, jetA);
 
  224  for (
int i = 0; i < n; i++) {
 
  225    diJ[i] = compute_diJ(jetA);
 
  234  double diJ_min = diJ[0];
 
  236  for (
int i = 1; i < n; i++) {
 
  237    if (diJ[i] < diJ_min) {
 
  244  NNBJ * jetA = & briefjets[diJ_min_jet];
 
  247  iB = jetA->NN ? jetA->NN->index() : -1;
 
  255  NNBJ * jetA = where_is[iA];
 
  262  where_is[jetA->index()] = jetA;
 
  263  diJ[jetA - head] = diJ[tail-head];
 
  266  for (NNBJ * jetI = head; jetI != tail; jetI++) {
 
  268    if (jetI->NN == jetA) {
 
  269      set_NN_nocross(jetI, head, tail);
 
  270      diJ[jetI-head] = compute_diJ(jetI); 
 
  273    if (jetI->NN == tail) {jetI->NN = jetA;}
 
  282  NNBJ * jetA = where_is[iA];
 
  283  NNBJ * jetB = where_is[iB];
 
  289  if (jetA < jetB) std::swap(jetA,jetB);
 
  292  this->init_jet(jetB, jet, index);
 
  294  if (index >= 
int(where_is.size())) where_is.resize(2*index);
 
  295  where_is[jetB->index()] = jetB;
 
  303  where_is[jetA->index()] = jetA;
 
  304  diJ[jetA - head] = diJ[tail-head];
 
  307  for (NNBJ * jetI = head; jetI != tail; jetI++) {
 
  309    if (jetI->NN == jetA || jetI->NN == jetB) {
 
  310      set_NN_nocross(jetI, head, tail);
 
  311      diJ[jetI-head] = compute_diJ(jetI); 
 
  316    double dist = jetI->geometrical_distance(jetB);
 
  317    if (dist < jetI->NN_dist) {  
 
  319        jetI->NN_dist = dist;
 
  321        diJ[jetI-head] = compute_diJ(jetI); 
 
  324    if (dist < jetB->NN_dist) { 
 
  326        jetB->NN_dist = dist;
 
  332    if (jetI->NN == tail) {jetI->NN = jetA;}
 
  336  diJ[jetB-head] = compute_diJ(jetB);
 
  343                    NNBJ * begin, NNBJ * end) {
 
  344  double NN_dist = jet->geometrical_beam_distance();
 
  346  for (NNBJ * jetB = begin; jetB != end; jetB++) {
 
  347    double dist = jet->geometrical_distance(jetB);
 
  348    if (dist < NN_dist) {
 
  352    if (dist < jetB->NN_dist) {
 
  353      jetB->NN_dist = dist;
 
  358  jet->NN_dist = NN_dist;
 
  365template <
class BJ, 
class I>  
void NNFJN2Plain<BJ,I>::set_NN_nocross(
 
  366                 NNBJ * jet, NNBJ * begin, NNBJ * end) {
 
  367  double NN_dist = jet->geometrical_beam_distance();
 
  372    for (NNBJ * jetB = begin; jetB != jet; jetB++) {
 
  373      double dist = jet->geometrical_distance(jetB);
 
  374      if (dist < NN_dist) {
 
  383    for (NNBJ * jetB = jet+1; jetB != end; jetB++) {
 
  384      double dist = jet->geometrical_distance(jetB);
 
  385      if (dist < NN_dist) {
 
  392  jet->NN_dist = NN_dist;
 
Helps solve closest pair problems with generic interparticle and particle-beam distances.
 
Helps solve closest pair problems with factorised interparticle and beam distances (ie satisfying the...
 
~NNFJN2Plain()
a destructor
 
NNFJN2Plain(const std::vector< PseudoJet > &jets)
constructor with an initial set of jets (which will be assigned indices 0...jets.size()-1)
 
Class to contain pseudojets, including minimal information of use to jet-clustering routines.