1 #ifndef __FASTJET_NNFJN2PLAIN_HH__ 
    2 #define __FASTJET_NNFJN2PLAIN_HH__ 
   34 #include "fastjet/NNBase.hh" 
   36 FASTJET_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;
 
  365 template <
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;
 
  398 FASTJET_END_NAMESPACE      
 
  401 #endif // __FASTJET_NNFJN2PLAIN_HH__