Index: contrib/contribs/IFNPlugin/trunk/example-IFN.cc
===================================================================
--- contrib/contribs/IFNPlugin/trunk/example-IFN.cc	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/example-IFN.cc	(revision 1447)
@@ -0,0 +1,159 @@
+// To run this example, use the following command:
+//
+//   ./example < data/pythia8_Zq_vshort.dat
+//
+// NB: the example file reads in a file with 6 light flavours, and
+//     an extra high density of quarks, to help with "make check"
+//     test things more thoroughly
+//----------------------------------------------------------------------
+// $Id$
+//
+// Copyright (c) 2023, Fabrizio Caola, Radoslaw Grabarczyk, 
+// Maxwell Hutt, Gavin P. Salam, Ludovic Scyboz, and Jesse Thaler
+//
+//----------------------------------------------------------------------
+// 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 <http://www.gnu.org/licenses/>.
+//----------------------------------------------------------------------
+
+#include <iostream>
+#include <iomanip>
+
+#include "fastjet/PseudoJet.hh"
+#include "fastjet/contrib/IFNPlugin.hh" // In external code, this may become fastjet/contrib/IFNPlugin.hh
+
+using namespace std;
+using namespace fastjet;
+using namespace fastjet::contrib;
+
+// forward declaration to make things clearer
+void read_event(vector<PseudoJet> &event);
+
+//----------------------------------------------------------------------
+int main(int iargc, char **argv){
+
+  // give user control over printout (mainly relevant for make check)
+  // usage: "./example [nevmax [njetmax]] < data/pythia8_Zq_vshort.dat"
+  unsigned int nevmax = 2;
+  unsigned int njetmax = 1;
+  if (iargc > 1) nevmax  = stoi(argv[1]);
+  if (iargc > 2) njetmax = stoi(argv[2]);
+
+  // print banner for FastJet at the start, so it doesn't mix
+  // into the other output
+  ClusterSequence::print_banner(); 
+
+  // we start with a base jet definition (should be either
+  // antikt_algorithm or cambridge_algorithm, or their e+e- variants)
+  JetDefinition base_jet_def(antikt_algorithm, 0.4);
+  // enable it to track flavours (default is net flavour)
+  FlavRecombiner flav_recombiner;
+  base_jet_def.set_recombiner(&flav_recombiner);
+
+  // And then we set up the IFNPlugin that builds on the base_jet_def
+  // The main free parameter, alpha, in the uij distance, 
+  //   uij = max(pt_i, pt_j)^alpha min(pt_i, pt_j)^(2-alpha) Omega_ij
+  double alpha = 2.0;
+
+  // The parameter that sets the nature of the Omega rapidity term;
+  // only change the default of 3-alpha if you are sure you know what you are doing
+  double omega = 3.0 - alpha;
+
+  // The flavour summation scheme; should be one of 
+  //   - FlavRecombiner::net
+  //   - FlavRecombiner::modulo_2
+  FlavRecombiner::FlavSummation flav_summation = FlavRecombiner::net;
+
+  // then construct the IFNPlugin jet definition
+  auto ifn_plugin = new IFNPlugin(base_jet_def, alpha, omega, flav_summation);
+  JetDefinition IFN_jet_def(ifn_plugin);
+  IFN_jet_def.delete_plugin_when_unused();
+
+  cout << "base jet definition: " << base_jet_def.description() << endl;
+  cout << "IFN jet definition:  " << IFN_jet_def.description() << endl;
+
+  // loop over some number of events
+  int n_events = 10;
+  for (int iev = 0; iev < n_events && iev < nevmax; iev++) {
+
+    // read in input particles: see that routine for info 
+    // on how to set up the PseudoJets with flavour information
+    vector<PseudoJet> event;
+    read_event(event);
+    cout << "\n#---------------------------------------------------------------\n";
+    cout << "# read event " << iev << " with " << event.size() << " particles" << endl;
+
+    // run the jet clustering with the base jet definition and the
+    // IFNPlugin-based jet definition
+    vector<PseudoJet> base_jets = base_jet_def(event);
+    vector<PseudoJet> IFN_jets  = IFN_jet_def(event);
+
+    // make sure the sizes are the same
+    assert(base_jets.size() == IFN_jets.size());
+
+    // ----------------------------------------------------
+    // loop over the two leading jets and print out their properties
+    for (unsigned int ijet = 0; ijet < base_jets.size() && ijet < njetmax; ijet++) {
+      // first print out the original anti-kt jets and the IFN jets
+      const auto & base_jet = base_jets[ijet];
+      const auto & IFN_jet  = IFN_jets [ijet];
+      cout << endl;
+      cout << "base jet " << ijet << ": ";
+      cout << "pt=" << base_jet.pt() << " rap=" << base_jet.rap() << " phi=" << base_jet.phi();
+      cout << ", flav = " << FlavHistory::current_flavour_of(base_jet).description() << endl;
+      cout << "IFN jet  " << ijet << ": ";
+      cout << "pt=" << IFN_jet.pt() << " rap=" << IFN_jet.rap() << " phi=" << IFN_jet.phi();
+      cout << ", flav = " << FlavHistory::current_flavour_of(IFN_jet).description() << endl;
+      
+      // for the first event, print out the jet constituents' pt and initial and final flavours
+      cout << "constituents:" << endl;
+      for (const auto & c: sorted_by_pt(IFN_jet.constituents())) {
+        cout << "  pt = " << setw(10) << c.pt();
+        cout << ", orig. flav = " << setw(8) << FlavHistory::initial_flavour_of(c).description();
+        cout << ", final flav = " << setw(8) << FlavHistory::current_flavour_of(c).description();          
+        cout << endl;
+      }
+    }
+  }
+
+  return 0;
+}
+
+// read in input particles and set up PseudoJets with flavour information
+void read_event(vector<PseudoJet> &event){  
+    // read in the input particles and their PDG IDs
+    string line;
+    double px, py, pz, E;
+    int    pdg_id;
+    event.resize(0);
+    while(getline(cin,line)) {
+      if(line[0] == '#') continue;
+
+      istringstream iss(line);
+      iss >> px >> py >> pz >> E >> pdg_id;
+      // create a fastjet::PseudoJet with these components and put it onto
+      // back of the input_particles vector
+      PseudoJet p(px,py,pz,E);
+
+      // assign information about flavour (will be deleted automatically)
+      p.set_user_info(new FlavHistory(pdg_id));
+      event.push_back(p);
+
+      if (cin.peek() == '\n' || cin.peek() == EOF) {
+        getline(cin,line);
+        break;
+      }
+    }
+}
Index: contrib/contribs/IFNPlugin/trunk/FlavNeutraliser.cc
===================================================================
--- contrib/contribs/IFNPlugin/trunk/FlavNeutraliser.cc	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/FlavNeutraliser.cc	(revision 1447)
@@ -0,0 +1,630 @@
+#include "fastjet/contrib/FlavInfo.hh"
+#include "fastjet/contrib/MassFlav.hh"
+#include "fastjet/contrib/FlavNeutraliser.hh"
+
+#ifndef __FJC_FLAVINFO_USEFJCORE__
+#include "fastjet/ClusterSequence.hh"
+#include "fastjet/SharedPtr.hh"
+#endif
+
+#include <limits>
+
+#include <numeric>
+#include <tuple>
+
+using namespace std;
+
+//#define DEBUG
+
+FASTJET_BEGIN_NAMESPACE      // defined in fastjet/internal/base.hh
+
+LimitedWarning _warn_old_measure(100);
+LimitedWarning _warn_aktlike_measure(100);
+
+namespace contrib{
+  
+// Set the scale at which to switch from standard measures (e.g. cosphi_coshy)
+// to delta_R measure for small delta_R
+const double FlavNeutraliser::_deltaR2_handover =
+    pow(std::numeric_limits<double>::epsilon(), 0.5);
+
+/// returns true if there is flavour to neutralise betwen jets j & k
+bool have_flavour_to_neutralise(const PseudoJet & j, const PseudoJet & k, bool modulo_2) {
+  const FlavInfo & flav1 = FlavHistory::current_flavour_of(j);
+  const FlavInfo & flav2 = FlavHistory::current_flavour_of(k);
+
+  if (!modulo_2) {
+    for (unsigned i = 1; i <= 6; i++) {
+      if (flav2.operator[](i) * flav1.operator[](i) < -0) return true;
+    }
+  } else {
+    for (unsigned i = 1; i <= 6; i++) {
+      if (flav2.operator[](i) == 1 && flav1.operator[](i) == 1) return true;
+    }
+  }
+  return false;
+}
+
+
+/// The distance measure
+double FlavNeutraliser::neutralisation_distance(
+       const PseudoJet &p1, const PseudoJet &p2, double ref_scale) 
+                                    const {
+  if (_spherical_algo) {
+    // Tried to do with single normalisation but sqrt() precision gives
+    // failures, ie sqrt(p1.modp2()*p2.modp2()) !=
+    // sqrt(p1.modp2())*sqrt(p2.modp2()). The below still uses 2 sqrt()
+    // functions in modp()
+
+    double norm = 1.0 / (p1.modp() * p2.modp());
+    double one_minus_cos_theta =
+        1.0 - (p1.px()*p2.px() + p1.py()*p2.py() + p1.pz()*p2.pz()) * norm;
+    // safety checks when the angle gets small
+    if (one_minus_cos_theta*one_minus_cos_theta < std::numeric_limits<double>::epsilon()) {
+      double cx = p1.py() * p2.pz() - p2.py() * p1.pz();
+      double cy = p1.pz() * p2.px() - p2.pz() * p1.px();
+      double cz = p1.px() * p2.py() - p2.px() * p1.py();
+      double sin2theta = (cx*cx + cy*cy + cz*cz) * norm*norm;
+      one_minus_cos_theta = sin2theta/2;
+    }
+
+    double u;
+    if (_measure == aktlike_pair_refratio) {
+      _warn_aktlike_measure.warn("FlavNeutraliser::neutralisation_distance: using aktlike_pair_refratio, which is not validated");
+      // default to the anti-kt like measure
+      u = 2*one_minus_cos_theta/pow(std::max(p1.E(), p2.E()),2);
+      // if both particles are flavoured, multiply by Emax^4/Q^4
+      if ( !FlavHistory::current_flavour_of(p1).is_flavourless()
+        && !FlavHistory::current_flavour_of(p2).is_flavourless()) {
+          u *= pow(std::max(p1.E(),p2.E())/ref_scale, 4);
+      }
+    } else if (_measure == jade || _measure == jadea2) {
+      u = 2 * p1.E() * p2.E() * one_minus_cos_theta;
+    } else if (_measure == maxscale) {
+      u = 2 * pow(std::max(p1.E(), p2.E()), 2) * one_minus_cos_theta;
+    } else if (_measure == general) {
+      u = 2 * pow(std::max(p1.E(), p2.E()), 2*_p) * pow(std::min(p1.E(), p2.E()), 2*_q) * one_minus_cos_theta;
+    } else {
+      // all other options 
+      _warn_old_measure.warn("FlavNeutraliser::neutralisation_distance: using deprecated old ratio measure");
+      u = 2 * pow(std::max(p1.E(), p2.E()) / std::min(p1.E(), p2.E()), 2*_pp) 
+          * one_minus_cos_theta;
+    }
+    return u;
+
+  } else {
+    assert(_pp==1);
+    // suggestion; first calculate the ratio of squared pts
+    // (this avoids square roots -- hopefully should not
+    // trigger under/overflow)
+    double p1t2 = p1.pt2();
+    double p2t2 = p2.pt2();
+    double pt2ratio = p1t2 > p2t2 ? p1t2 / p2t2 : p2t2 / p1t2;
+    double u, maxpt2, maxpt2p, minpt2q, p1tp2t;
+    double drap = fabs(accurate_rap(p1) - accurate_rap(p2));
+    double dphi = accurate_absdphi(p1,p2);
+
+    //double old_deltaR2 = p1.squared_distance(p2);
+    double deltaR2 = drap*drap + dphi*dphi;
+
+    switch (_measure) {  
+      case general:
+        maxpt2p = pow(std::max(p1.pt2(), p2.pt2()),_p);
+        minpt2q = pow(std::min(p1.pt2(), p2.pt2()),_q);
+        if (deltaR2 > _deltaR2_handover) return maxpt2p*minpt2q * 2*((cosh(_a*drap) - 1)/(_a*_a) 
+                                                                    - (cos(dphi) - 1));
+        else                             return maxpt2p*minpt2q * deltaR2;  
+
+      case sinh_delta_R:
+        _warn_old_measure.warn("FlavNeutraliser::neutralisation_distance: using deprecated old ratio measure");
+        if (deltaR2 > _deltaR2_handover) return pt2ratio * pow(sinh(sqrt(deltaR2)), 2);
+        else                             return pt2ratio * deltaR2;
+      case delta_R:
+        _warn_old_measure.warn("FlavNeutraliser::neutralisation_distance: using deprecated old ratio measure");
+        return pt2ratio * deltaR2;
+      case jade_delta_R:
+        p1tp2t = sqrt(p1t2*p2t2);
+        return p1tp2t * deltaR2;
+      case maxscale_delta_R:
+        maxpt2 = std::max(p1.pt2(), p2.pt2());
+        return maxpt2 * deltaR2;
+      case phi2_coshy:
+        // dphi = p1.delta_phi_to(p2);
+        // drap = std::abs(p1.rap() - p2.rap());
+        if (deltaR2 > _deltaR2_handover) return pt2ratio * (pow(dphi, 2) + 2*(cosh(drap) - 1));
+        else                             return pt2ratio * deltaR2;
+      case cosphi_coshy:
+        _warn_old_measure.warn("FlavNeutraliser::neutralisation_distance: using deprecated old ratio measure");
+        //cout << "accr: " << drap << " " << dphi << " " << new_deltaR2 << "\n";
+        // dphi = p1.delta_phi_to(p2);
+        // drap = std::abs(p1.rap() - p2.rap());
+        //cout << "orig: " << drap << " " << dphi << " " << deltaR2 << "\n\n";
+        // _deltaR2_handover is defined to be sqrt(epsilon), where epsilon is 
+        // machine precision
+        if (deltaR2 > _deltaR2_handover) return pt2ratio * 2*(cosh(drap)-cos(dphi));
+        else                             return pt2ratio * deltaR2;
+      case aktlike_pair_refratio:
+      case aktlike_pair_dynrefratio:
+        _warn_aktlike_measure.warn("FlavNeutraliser::neutralisation_distance: using aktlike_pair_refratio, which is not validated");
+        // dphi = p1.delta_phi_to(p2);
+        // drap = std::abs(p1.rap() - p2.rap());
+        maxpt2 = std::max(p1.pt2(), p2.pt2());
+        u = 1.0/maxpt2;
+        if (deltaR2 > _deltaR2_handover) u *= 2*(cosh(drap)-cos(dphi));
+        else                             u *= deltaR2;
+        if ( !FlavHistory::current_flavour_of(p1).is_flavourless()
+          && !FlavHistory::current_flavour_of(p2).is_flavourless()) {
+            u *= pow(maxpt2/pow(ref_scale,2), 2);
+        }
+        return u;
+      case jade:
+        // a hadron-collider version of the JADE (without the correction factor a)
+        // dphi = p1.delta_phi_to(p2);
+        // drap = std::abs(p1.rap() - p2.rap());
+        p1tp2t = sqrt(p1t2*p2t2);
+        if (deltaR2 > _deltaR2_handover) return p1tp2t * 2*(cosh(drap)-cos(dphi));
+        else                             return p1tp2t * deltaR2;
+
+      case jadea2:
+        // a hadron-collider version of the JADE (with a = 2)
+        // dphi = p1.delta_phi_to(p2);
+        // drap = std::abs(p1.rap() - p2.rap());
+        p1tp2t = sqrt(p1t2*p2t2);
+        //cout << "p1tp2t: " << p1tp2t << ", deltaR2 = " << deltaR2 << ", u=" << p1tp2t * deltaR2 << "\n";
+        //cout << "drap = " << drap << ", dphi = " << dphi << "\n";
+        if (deltaR2 > _deltaR2_handover) return p1tp2t * 2*( (cosh(2*drap)-1)/4 + (1-cos(dphi)) );
+        else                             return p1tp2t * deltaR2;
+        
+      case maxscale:
+        // use the max(pt^2) option
+        // dphi = p1.delta_phi_to(p2);
+        // drap = std::abs(p1.rap() - p2.rap());
+        maxpt2 = std::max(p1.pt2(), p2.pt2());
+        if (deltaR2 > _deltaR2_handover) return maxpt2 * 2*(cosh(drap)-cos(dphi));
+        else                             return maxpt2 * deltaR2;
+
+      default:
+        throw Error("Unrecognised neutralisation measure");
+    }
+  }
+}
+
+
+//----------------------------------------------------------------------
+void neutralise_flavour(PseudoJet & j, PseudoJet & k, int hist_step,
+                        bool modulo_2) {
+  FlavInfo flav1 = FlavHistory::current_flavour_of(j);
+  FlavInfo flav2 = FlavHistory::current_flavour_of(k);
+
+  if (!modulo_2) {
+    // if using normal flavour (non-mod2) then check that flavours are
+    // opposite, i.e. flav1*flav2 < 0 in order to neutralise
+    for (unsigned i = 1; i <= 6; i++) {
+      // Change this to account for both cases at once
+      if (flav2.operator[](i) * flav1.operator[](i) < -0 &&
+          (abs(flav2.operator[](i)) <= abs(flav1.operator[](i)))) {
+        flav1._flav_content[i] =
+            flav2._flav_content[i] + flav1._flav_content[i];
+        flav2._flav_content[i] = 0;
+      }
+      if (flav2.operator[](i) * flav1.operator[](i) < -0 &&
+          (abs(flav2.operator[](i)) > abs(flav1.operator[](i)))) {
+        flav2._flav_content[i] =
+            flav2._flav_content[i] + flav1._flav_content[i];
+        flav1._flav_content[i] = 0;
+      }
+    }
+  } else {
+    // if using mod2 flavour then each flavour is either 1 or 0 so just
+    // require flavours to both be 1 in order to neutralise
+    for (unsigned i = 1; i <= 6; i++) {
+      if (flav2.operator[](i) == 1 && flav1.operator[](i) == 1) {
+        flav1._flav_content[i] = 0;
+        flav2._flav_content[i] = 0;
+      }
+    }
+  }
+  flav1.update_flavourless_attribute();
+  flav2.update_flavourless_attribute();
+
+  dynamic_cast<FlavHistory *>(j.user_info_shared_ptr().get())
+      ->update_flavour_history(flav1, hist_step);
+  dynamic_cast<FlavHistory *>(k.user_info_shared_ptr().get())
+      ->update_flavour_history(flav2, hist_step);
+}
+
+//----------------------------------------------------------------------
+// Compare flavour of each jet from a pair of vector<fastjet::PseudoJet>
+// objects. If there are >max_jets jets in one vector, only the first max_jets
+// terms are compared (in order of decreasing hardness).
+
+vector<PseudoJet> sorted_by_px(const vector<PseudoJet> & jets) {
+   vector<double> px(jets.size());
+   for (size_t i = 0; i < jets.size(); i++) {px[i] = jets[i].px();}
+   return objects_sorted_by_values(jets, px);
+ }
+
+bool jet_flavour_compare(const vector<fastjet::PseudoJet> &j,
+                         const vector<fastjet::PseudoJet> &k,
+                         const int max_jets, bool sort_by_px) {
+    vector<fastjet::PseudoJet> jets_j = sorted_by_E(j);
+    vector<fastjet::PseudoJet> jets_k = sorted_by_E(k);
+    if(sort_by_px){
+      jets_j = sorted_by_px(j);
+      jets_k = sorted_by_px(k);
+    }
+  unsigned max_count =
+      max_jets < 0
+          ? std::min({int(jets_j.size()), int(jets_k.size())})
+          : std::min({int(jets_j.size()), int(jets_k.size()), max_jets});
+  for (unsigned i = 0; i < max_count; i++) {
+    assert(jets_j[i].has_user_info() && jets_k[i].has_user_info());
+    FlavInfo flav1 = jets_j[i].user_info<FlavHistory>().current_flavour();
+    FlavInfo flav2 = jets_k[i].user_info<FlavHistory>().current_flavour();
+    flav1.update_flavourless_attribute();
+    flav2.update_flavourless_attribute();
+    if (flav1 != flav2) {
+      return false;
+    }
+  }
+  return true;
+}
+
+//----------------------------------------------------------------------
+// Compare net flavour of each jet from a pair of vector<fastjet::PseudoJet>
+// objects.
+bool jet_net_flavour_compare(vector<fastjet::PseudoJet> &j,
+                             vector<fastjet::PseudoJet> &k) {
+  FlavInfo flav_j, flav_k; //net flavours
+
+  for (unsigned i = 0; i < j.size(); i++) {
+      assert(j[i].has_user_info());
+      FlavInfo fl = FlavHistory::current_flavour_of(j[i]);
+      for (unsigned l=1; l<=6; l++){
+        flav_j._flav_content[l] += fl._flav_content[l];
+      }
+  }
+
+  for (unsigned i = 0; i < k.size(); i++) {
+      assert(k[i].has_user_info());
+      FlavInfo fl = FlavHistory::current_flavour_of(k[i]);
+      for (unsigned l=1; l<=6; l++){
+        flav_k._flav_content[l] += fl._flav_content[l];
+      }
+  }
+
+  if (flav_j!=flav_k) {
+    return 0;
+  }
+  return 1;
+}
+
+//----------------------------------------------------------------------
+// The method takes a ClusterSequence as argument and goes through
+// each step of the declustering to neutralise flavour
+std::vector<PseudoJet> FlavNeutraliser::neutralise(ClusterSequence & cs) const {
+
+  // Setup the FlavRecombiner
+  unique_ptr<JetDefinition::Recombiner> flav_recombiner;
+  flav_recombiner.reset(_use_mass_flav ? new MassFlavRecombiner()
+                                       : new FlavRecombiner());
+  //flav_recombiner.reset(new FlavRecombiner());
+
+
+  // Copy across a the list of all pseudojets
+  vector<PseudoJet> jets = cs.jets();
+  // The clustering history
+  const vector<ClusterSequence::history_element> & hist = cs.history();
+
+  // shorthand for the hardness (as of 2022-07-26, not yet being used everywhere)
+  auto hardness = _spherical_algo  
+      ? [](const PseudoJet & j) {return  j.E();}
+      : [](const PseudoJet & j) {return  j.pt();};
+
+
+  // NOTE -- pp ref scale should evolve to become something
+  // less sensitive to UE & pileup, but for now take something simple
+  // It is used only for the aktlike_pair_refratio option
+  double ref_scale = 0;
+  if (_measure == aktlike_pair_refratio) {
+    for (unsigned i = 0; i < cs.n_particles(); i++) {
+      ref_scale += hardness(jets[i]);
+    }
+  } else if (_measure == aktlike_pair_dynrefratio) {
+    for (unsigned i = 0; i < cs.n_particles(); i++) {
+      ref_scale = max(ref_scale, hardness(jets[i]));
+    }
+  }
+
+  // Loop over each step of the clustering
+  for (unsigned ih_step = 0; ih_step < hist.size(); ++ih_step) {
+
+    const ClusterSequence::history_element & hist_step = hist[ih_step];
+
+    // Get the two parent jets' history indices
+    int index1 = hist_step.parent1;
+    int index2 = hist_step.parent2;
+
+    // Check that it's a valid recombined jet
+    if (index1 < 0 || index2 < 0) continue;
+
+
+    // arranges the indices such that index1 corresponds to the softer jet
+    // or correspondingly jet_i below is the softer one
+    if (hardness(jets[hist[index1].jetp_index]) 
+        > hardness(jets[hist[index2].jetp_index])) std::swap(index1, index2);
+    //if (!_spherical_algo) {
+    //  if (jets[hist[index1].jetp_index].pt() >
+    //      jets[hist[index2].jetp_index].pt())
+    //    std::swap(index1, index2);
+    //} else {
+    //  if (jets[hist[index1].jetp_index].E() >
+    //      jets[hist[index2].jetp_index].E())
+    //    std::swap(index1, index2);
+    //}
+    
+    PseudoJet & jet_i = jets[hist[index1].jetp_index];
+    PseudoJet & jet_j = jets[hist[index2].jetp_index];
+
+    // If i is flavourless, get the child, do the standard recombination and
+    // move on to the next history step
+    const FlavInfo & flav_i = FlavHistory::current_flavour_of(jet_i);
+    if (flav_i.is_flavourless()) {
+      int cluster_hist_index_temp = jets[hist_step.jetp_index].cluster_hist_index();
+      flav_recombiner->recombine(jet_i, jet_j, jets[hist_step.jetp_index]);
+      jets[hist_step.jetp_index].set_cluster_hist_index(cluster_hist_index_temp);
+      dynamic_cast<FlavHistory *>(
+          jets[hist_step.jetp_index].user_info_shared_ptr().get())
+          ->amend_last_history_index(ih_step);
+      if (_modulo_2) {
+        dynamic_cast<FlavHistory *>(
+            jets[hist_step.jetp_index].user_info_shared_ptr().get())
+            ->apply_modulo_2();
+      }
+      // if relevant, update the dynamic reference scale before continuing with the loop
+      if (_measure == aktlike_pair_dynrefratio) 
+           ref_scale = max(ref_scale, hardness(jets[hist_step.jetp_index]));
+      continue;
+    }
+
+    const double uij = neutralisation_distance(jet_i, jet_j, ref_scale);
+    if (_writeout_uijs) cout << "uij for pair about to cluster is " 
+                             << uij << ", i,j=" << jet_i.cluster_hist_index() 
+                             << ", " << jet_j.cluster_hist_index() << endl;
+
+    // If not, identify all flavoured PseudoJets and their distance to
+    // the current jet i getting recombined, and put them in a list K
+    std::vector<std::pair<PseudoJet*, double>> flavour_candidates;
+
+    // note: this loop is not especially efficient -- it may be
+    // worth exploring some kind of dynamically maintained list of 
+    // flavoured objects (on the other hand the loop probbaly isn't
+    // used all that often)
+    for (unsigned k = 0; k < jets.size(); ++k) {
+
+      PseudoJet & jet_k = jets[k];
+
+      // Check k != i (i.e. not itself)
+      if (int(k) == hist[index1].jetp_index) continue;     
+
+      // Check k != j to stop needless neutralisation of i and j before 
+      // recombination
+      if (int(k) == hist[index2].jetp_index) continue;
+
+      // If the jet is not currently around, skip
+      // First check it has already been created
+      if (jets[k].cluster_hist_index() >= int(ih_step)) continue;
+
+      // then check that it wasn't recombined meanwhile
+      if ( (hist[hist[jets[k].cluster_hist_index()].child].parent2 != -1)
+           && (hist[jets[k].cluster_hist_index()].child < int(ih_step)) ) continue;
+
+      // Get the flavour info
+      const FlavInfo & flav = FlavHistory::current_flavour_of(jet_k);
+
+      // If it carries flavour, compute the distance u_ik and add it to the list
+      if (!flav.is_flavourless()) {
+        //double uik = neutralisation_distance(jet_i, *j);
+        //flavour_candidates.push_back(std::make_pair(j, uik));
+        flavour_candidates.push_back(std::make_pair(&jet_k, 0.0));
+      }
+    }
+
+    if (recursive()) {
+      // it will be useful to have jet j in the list as part of the recursion
+      flavour_candidates.push_back(std::make_pair(&jet_j, 0.0));
+      use_neutralisation_candidates_recursive(jet_i, uij, ih_step, flavour_candidates, ref_scale, &jet_j);
+    } else {
+      use_neutralisation_candidates(jet_i, uij, ih_step, flavour_candidates, ref_scale);
+    }
+
+//    // Sort the list in decreasing order of u_ik
+//    sort(flavour_candidates.begin(), flavour_candidates.end(),
+//        [](std::pair<PseudoJet*,double> & a, std::pair<PseudoJet*,double> & b) {return a.second > b.second;});
+//
+//    // Now, loop over all jets in the list K
+//    while (!flavour_candidates.empty()) {
+//
+//      // Get the last element (the one with the smaller u_ik)
+//      const std::pair<PseudoJet*,double> current_neutraliser = flavour_candidates.back();
+//
+//      // If u_ik >= u_ij, we're done
+//      if (current_neutraliser.second >= uij) break;
+//
+//      // Otherwise, take the corresponding pseudojet k, and neutralise as much flavour from jet_i
+//      // as one can with k
+//      neutralise_flavour(jet_i, *current_neutraliser.first, ih_step, _modulo_2);
+//
+//      FlavInfo flav_i = FlavHistory::current_flavour_of(jet_i);
+//      if (!flav_i.is_flavourless()) {
+//        flavour_candidates.pop_back();
+//      } else {
+//        // i is flavourless, so go to recombiner step below while loop
+//        break;
+//      }
+//
+//    }
+
+    // If i is flavourless, the set is empty, or all remaining k have u_ik > u_ij, recombine
+    int cluster_hist_index_temp = jets[hist_step.jetp_index].cluster_hist_index();
+    assert(cluster_hist_index_temp == int(ih_step));
+    flav_recombiner->recombine(jet_i, jet_j, jets[hist_step.jetp_index]);
+    jets[hist_step.jetp_index].set_cluster_hist_index(cluster_hist_index_temp);
+    dynamic_cast<FlavHistory *>(
+        jets[hist_step.jetp_index].user_info_shared_ptr().get())
+        ->amend_last_history_index(ih_step);
+    if (_modulo_2) {
+      dynamic_cast<FlavHistory *>(
+          jets[hist_step.jetp_index].user_info_shared_ptr().get())
+          ->apply_modulo_2();
+    }
+
+    // if relevant, update the dynamic reference scale before continuing with the loop
+    if (_measure == aktlike_pair_dynrefratio) 
+          ref_scale = max(ref_scale, hardness(jets[hist_step.jetp_index]));
+  }
+
+  return jets;
+
+}
+
+void FlavNeutraliser::use_neutralisation_candidates(
+    PseudoJet & jet_i,
+    double uij,
+    int ih_step,
+    std::vector<std::pair<PseudoJet*, double>> & flavour_candidates, double ref_scale) const {
+
+  // set up the uik neutralisation distances
+  for (auto & fc: flavour_candidates) {
+    fc.second = neutralisation_distance(jet_i, *(fc.first), ref_scale);
+  }
+
+  // Sort the list in decreasing order of u_ik
+  sort(flavour_candidates.begin(), flavour_candidates.end(),
+      [](std::pair<PseudoJet*,double> & a, std::pair<PseudoJet*,double> & b) {return a.second > b.second;});
+
+  // Now, loop over all jets in the list K
+  while (!flavour_candidates.empty()) {
+
+    // Get the last element (the one with the smaller u_ik)
+    const std::pair<PseudoJet*,double> current_neutraliser = flavour_candidates.back();
+
+    // If u_ik >= u_ij, we're done
+    if (current_neutraliser.second >= uij) break;
+
+    // Otherwise, take the corresponding pseudojet k, and neutralise as much flavour from jet_i
+    // as one can with k
+    //if (have_flavour_to_neutralise(jet_i, *current_neutraliser.first, _modulo_2)) {
+    neutralise_flavour(jet_i, *current_neutraliser.first, ih_step, _modulo_2);
+    //}
+
+    FlavInfo flav_i = FlavHistory::current_flavour_of(jet_i);
+    if (!flav_i.is_flavourless()) {
+      flavour_candidates.pop_back();
+    } else {
+      // i is flavourless, so go to recombiner step below while loop
+      break;
+    }
+
+  }
+
+}
+
+/// This is an attempt to think about a potential more global
+/// neutralisation procedure.
+///
+/// Suppose we have a situation  
+///
+///  E| 0                               0 = u
+///   |                                 1 = ubar
+///   |                                 2 = ubar
+///   |    1     2 3                    3 = u
+///   +---------------------------------
+///                                  rap
+///
+///  - jet_i = 1, jet_j that it will cluster with is 0 and u10 is quite large
+///  - 1 would find it favourable to neutralise with 3, u13 < u10
+///    (u12 < u13, but neutralisation not possible)
+///
+///  - before performing the 13 neutralisation, we check if 3 has
+///    a preferred neutralisation candidate, one with u3x < u13, and
+///    in this case u23 < u13, so 2 & 3 neutralise each other, and then
+///    we return to the search for a neutralisation partner for 1
+///
+///  A slightly non-trivial question is the set of particles over which
+///  we do the search for 3's potential neutralisation partners. Should
+///  it be all flavoured particles, including 0? How do we organise the
+///  corresponding information? The conclusion on 2022-05-29
+///  is that 
+///
+///  - when we examine neutralisation candidates for 1, we should
+///    not consider 0 (because neutralisation will happen when they
+///    recombine); 
+///
+///  - when we examine neutralisation candidates for 3, we add 0
+///    back into the mix, but we do not consider 1 (and if we find neutralisation
+///    candidates for 3 and recurse again, we do not consider 1 or 3)
+///
+/// The exclude argument serves solely to exclude the original "0"
+void FlavNeutraliser::use_neutralisation_candidates_recursive(
+    PseudoJet & jet_i,
+    double uij,
+    int ih_step,
+    std::vector<std::pair<PseudoJet*, double>> & flavour_candidates,
+    double ref_scale, 
+    const PseudoJet * jet_j_exclude) const {
+
+  // set up the uik neutralisation distances
+  for (auto & fc: flavour_candidates) {
+    fc.second = neutralisation_distance(jet_i, *(fc.first), ref_scale);
+    if (_writeout_uijs) {
+      cout << "in recursive step: u" << jet_i.cluster_hist_index() << "," 
+           << fc.first->cluster_hist_index() << " = " << fc.second << std::endl;
+    }
+  }
+
+  // Sort the list in order of increasing u_ik
+  sort(flavour_candidates.begin(), flavour_candidates.end(),
+      [](std::pair<PseudoJet*,double> & a, std::pair<PseudoJet*,double> & b) {return a.second < b.second;});
+
+  // Now, loop over all jets in the list K
+  for (auto current_neutraliser: flavour_candidates) {
+
+    //
+    if (current_neutraliser.first == jet_j_exclude) continue;
+
+    // If u_ik >= u_ij, we're done
+    if (current_neutraliser.second >= uij) break;
+
+    // Otherwise, take the corresponding pseudojet k, and neutralise as
+    // much flavour from jet_i as one can with k
+    if (have_flavour_to_neutralise(jet_i, *current_neutraliser.first, _modulo_2)) {
+      // but before doing that, we will allow k to explore its potential neutralisers
+      // so that we avoid stealing the flavour of k from something that should have
+      // preferentially have gone to k
+      //
+      // start by copying the candidates and removing the current one
+      std::vector<std::pair<PseudoJet*,double>> flavour_candidates_copy;
+      flavour_candidates_copy.reserve(flavour_candidates.size() - 1);
+      for (auto & fc: flavour_candidates) {
+        if (fc.first != current_neutraliser.first) flavour_candidates_copy.push_back(fc);
+      }
+      // then run the neutralisation procedure on anything that remains
+      use_neutralisation_candidates_recursive(*current_neutraliser.first, 
+        current_neutraliser.second, ih_step, flavour_candidates_copy, ref_scale);
+
+      // once we are done with the recursive call neutralise anything that 
+      // is still there to be neutralised
+      neutralise_flavour(jet_i, *current_neutraliser.first, ih_step, _modulo_2);
+    }
+
+    const FlavInfo & flav_i = FlavHistory::current_flavour_of(jet_i);
+    // if i is flavourless, there's nothing left to do, so we exit
+    if (flav_i.is_flavourless()) break;
+  }
+
+}
+
+
+} // namespace contrib
+FASTJET_END_NAMESPACE
Index: contrib/contribs/IFNPlugin/trunk/NEWS
===================================================================
--- contrib/contribs/IFNPlugin/trunk/NEWS	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/NEWS	(revision 1447)
@@ -0,0 +1,3 @@
+2024/0M/DD: expected release of version 1.0.0
+- initial release of the, with the following features:
+  
\ No newline at end of file
Index: contrib/contribs/IFNPlugin/trunk/Makefile
===================================================================
--- contrib/contribs/IFNPlugin/trunk/Makefile	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/Makefile	(revision 1447)
@@ -0,0 +1,106 @@
+# If you are using this Makefile standalone and fastjet-config is not
+# in your path, edit this line to specify the full path
+FASTJETCONFIG=fastjet-config
+PREFIX=`$(FASTJETCONFIG) --prefix`
+CXX=g++
+CXXFLAGS= -O3 -Wall -g -fPIC -DPIC -std=c++11
+# as compared to fjcontrib, these two scripts are to be found locally
+# change this if we integrate with fjcontrib
+install_script = $(SHELL) ../utils/install-sh
+check_script = ../utils/check.sh
+
+# global contrib-wide Makefile include may override some of the above
+# variables (leading "-" means don't give an error if you can't find
+# the file)
+-include ../.Makefile.inc
+
+#------------------------------------------------------------------------
+# things that are specific to this contrib
+NAME=JetFlav
+SRCS=IFNPlugin.cc FlavNeutraliser.cc FlavInfo.cc
+EXAMPLES=example-IFN
+INSTALLED_HEADERS=IFNPlugin.hh FlavNeutraliser.hh FlavInfo.hh MassFlav.hh
+# List here any dependencies on other contribs. Note that they 
+# must be listed (potentially with versioning constraints) also
+# in the FJCONTRIB.cfg file.
+DEPENDS_ON = RecursiveTools
+#------------------------------------------------------------------------
+
+CXXFLAGS+= $(shell $(FASTJETCONFIG) --cxxflags) 
+LDFLAGS += -lm $(shell $(FASTJETCONFIG) --libs)
+
+INCLUDE += -Iinclude/
+# loop over all entries in DEPENDS_ON and for each entry ENTRY
+# add -I../ENTRY to INCLUDE, -L../ENTRY to LDFLAGS and -lENTRY to LDFLAGS
+INCLUDE += $(foreach ENTRY,$(DEPENDS_ON),-I../$(ENTRY)/include)
+LDFLAGS += $(foreach ENTRY,$(DEPENDS_ON),-L../$(ENTRY) -l$(ENTRY))
+CXXFLAGS+= $(INCLUDE)
+
+# optionally, print out the INCLUDE and LDFLAGS variables
+# $(info INCLUDE=$(INCLUDE))
+# $(info LDFLAGS=$(LDFLAGS))
+
+OBJS  = $(SRCS:.cc=.o)
+EXAMPLES_SRCS  = $(EXAMPLES:=.cc)
+
+install_HEADER  = $(install_script) -c -m 644
+install_LIB     = $(install_script) -c -m 644
+install_DIR     = $(install_script) -d
+install_DATA    = $(install_script) -c -m 644
+install_PROGRAM = $(install_script) -c -s
+install_SCRIPT  = $(install_script) -c
+
+.PHONY: clean distclean examples check install
+
+# compilation of the code (default target)
+all: lib$(NAME).a
+
+lib$(NAME).a: $(OBJS) 
+	ar cru lib$(NAME).a $(OBJS)
+	ranlib lib$(NAME).a
+
+# building the examples
+examples: $(EXAMPLES)
+
+# the following construct makes it possible to automatically build
+# each of the examples listed in $EXAMPLES
+$(EXAMPLES): % : %.o all
+	$(CXX) $(CXXFLAGS) -o $@ $< -L. -l$(NAME) $(LDFLAGS)
+
+# check that everything went fine
+check: examples
+	@for prog in $(EXAMPLES); do\
+	  $(check_script) $${prog} ../data/pythia8_Zq_vshort.dat -1 -1 || exit 1; \
+	done
+	@echo "All tests successful"
+
+# cleaning the directory
+clean:
+	rm -f *~ *.o
+
+distclean: clean
+	rm -f lib$(NAME).a $(EXAMPLES)
+
+# install things in PREFIX/...
+install: all
+	$(install_DIR) $(PREFIX)/include/fastjet/contrib
+	for header in $(INSTALLED_HEADERS); do\
+	  $(install_HEADER) include/fastjet/contrib/$$header $(PREFIX)/include/fastjet/contrib/;\
+	done
+	$(install_DIR) $(PREFIX)/lib
+	$(install_LIB) lib$(NAME).a $(PREFIX)/lib
+
+depend:
+	makedepend -Y -- -Iinclude  -- $(SRCS) $(EXAMPLES_SRCS)
+# DO NOT DELETE
+
+IFNPlugin.o: include/fastjet/contrib/IFNPlugin.hh
+IFNPlugin.o: include/fastjet/contrib/FlavNeutraliser.hh
+IFNPlugin.o: include/fastjet/contrib/FlavInfo.hh
+FlavNeutraliser.o: include/fastjet/contrib/FlavInfo.hh
+FlavNeutraliser.o: include/fastjet/contrib/MassFlav.hh
+FlavNeutraliser.o: include/fastjet/contrib/FlavNeutraliser.hh
+FlavInfo.o: include/fastjet/contrib/FlavInfo.hh
+example-IFN.o: include/fastjet/contrib/IFNPlugin.hh
+example-IFN.o: include/fastjet/contrib/FlavNeutraliser.hh
+example-IFN.o: include/fastjet/contrib/FlavInfo.hh
Index: contrib/contribs/IFNPlugin/trunk/README
===================================================================
--- contrib/contribs/IFNPlugin/trunk/README	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/README	(revision 1447)
@@ -0,0 +1,82 @@
+JetFlav Contrib
+===============
+
+This contrib provides a range of tools for studying Jet Flavour,
+provided jointly by several groups who are active on the subject (see
+[AUTHORS](AUTHORS)).
+
+It includes
+
+- [Common utilities](#common-utilities), notably the `FlavInfo` and `FlavHistory` classes in [`FlavInfo.hh`](FlavInfo.hh)
+- Interleaved Flavour Neutralisation ([IFNPlugin](#ifnplugin))
+- [Further plugins and tools, still to be added]
+
+**The JetFlav code needs FastJet ≥ 3.4.1 to compile**
+
+Common Utilities
+================
+
+Various flavour-related utilities are to be found in [`FlavInfo.hh`](FlavInfo.hh):
+```cpp
+// given a particle assign a pdg_id to it, either via a FlavInfo 
+// (stores a static flavour)
+PseudoJet particle = ...;
+particle.set_user_info(new FlavInfo(pdg_id));
+// or via a FlavHistory (can track the evolution of the flavour)
+// particle.set_user_info(new FlavHistory(pdg_id));
+
+// Retrieve the amount of flavour of a given kind, e.g. amount of b-flavour
+// (example given for a particle with a FlavHistory)
+FlavInfo flav_info = FlavHistory::current_flavour_of(particle);
+// net amount of b-flavour
+int nb = flav_info[5];
+cout << "nb = " << nb << ", full description: " << flav_info.description() << endl;
+```
+
+IFNPlugin 
+=========
+
+This code provides an implementation of the interleaved
+flavour-neutralisation (IFN) algorithm from
+
+> Flavoured jets with exact anti-kt kinematics and tests of infrared and collinear safety,
+> by Fabrizio Caola, Radoslaw Grabarczyk, Maxwell Hutt, Gavin P. Salam, Ludovic Scyboz, and Jesse Thaler
+> https://arxiv.org/abs/2306.07314
+
+To learn how to use the library, the [`example-IFN.cc`](example-IFN.cc) code is
+a good place to get started.
+
+Main principles of IFN
+----------------------
+
+The IFN algorithm uses a base jet algorithm (anti-kt or C/A) and
+generates a clustering sequence that is kinematically equivalent to that
+base algorithm. At each clustering step, the algorithm checks whether it
+needs to perform flavour "neutralisation" of the particles involved in
+the clustering. The neutralisation can occur with other particles in the
+event, not involved in the kinematic clustering. 
+
+Code Structure
+--------------
+
+The main interface to the IFN algorithm is in [`IFNPlugin.hh`](IFNPlugin.hh):
+```cpp
+// create a base jet definition
+JetDefinition base_jet_def(antikt_algorithm, R);
+// create an IFNPlugin based on the jet definition, with 
+// a given alpha (recommended values, either 1 or 2)
+double alpha = 2.0;
+JetDefinition jet_def(new IFNPlugin(base_jet_def, alpha));
+jet_def.delete_plugin_when_unused();
+```
+
+The plugin can be used as standard with the FastJet package, e.g.:
+```cpp
+vector<PseudoJet> particles;
+// ... fill the particles ...
+auto jets = jet_def(particles);
+for (const auto & jet : jets) {
+  cout << "jet pt = " << jet.pt() 
+       << ", flav = " << FlavHistory::current_flavour_of(jet) << endl;
+}
+```
Index: contrib/contribs/IFNPlugin/trunk/FJCONTRIB.cfg
===================================================================
--- contrib/contribs/IFNPlugin/trunk/FJCONTRIB.cfg	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/FJCONTRIB.cfg	(revision 1447)
@@ -0,0 +1,2 @@
+version: 1.0.0-alpha1
+dependencies: RecursiveTools(2.0.3)
\ No newline at end of file
Index: contrib/contribs/IFNPlugin/trunk/IFNPlugin.cc
===================================================================
--- contrib/contribs/IFNPlugin/trunk/IFNPlugin.cc	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/IFNPlugin.cc	(revision 1447)
@@ -0,0 +1,206 @@
+#include "fastjet/contrib/IFNPlugin.hh"
+#include "fastjet/contrib/FlavNeutraliser.hh"
+
+#ifndef __FJC_FLAVINFO_USEFJCORE__
+#include "fastjet/ClusterSequence.hh"
+#endif
+
+// verification that we have a sufficiently recent version of FastJet
+#ifdef FASTJET_VERSION_NUMBER
+#if FASTJET_VERSION_NUMBER < 30401
+#error "IFNPlugin requires FastJet version 3.4.1 or higher"
+#endif
+#endif
+
+// for releases, this is commented out, though we might
+// still need it for tests.
+//#include "PseudoJetIO.hh"
+#include <sstream>
+
+FASTJET_BEGIN_NAMESPACE      // defined in fastjet/internal/base.hh
+namespace contrib{
+
+using namespace std;
+
+//---------------------------------------------------------------
+
+string IFNPlugin::description () const {
+  ostringstream desc;
+  desc <<  "Interleaved Flavour Neutralisation (IFN) plugin based on " << _jet_def.description();
+  if (_spherical_algo) {
+    desc << ", using a spherical neutralisation measure of type ";
+    switch (_measure_in) {
+        case FlavNeutraliser::general:
+          if (_p+_q == 1.0) desc << "standard uij, with alpha = " << 2*_p;
+          else              desc << "general case with p = " << _p << " q = " << _q; 
+          break;
+      case FlavNeutraliser::jade:
+          desc << "jade"; break;
+      case FlavNeutraliser::maxscale:
+          desc << "maxscale"; break;
+      case FlavNeutraliser::aktlike_pair_refratio:
+          desc << "aktlike_pair_refratio"; break;
+      default:
+          desc << "[deprecated, index=" << _measure_in<<"]"; 
+          desc << ", with pp = " << _pp;
+          break;
+    }
+  } else {
+    desc << ", using a ";
+    string nm = " neutralisation measure";
+    switch (_measure_in) {
+        case FlavNeutraliser::general:
+          if (_p+_q == 1.0) desc << "standard uij " << nm << " with alpha = " << 2*_p << ", omega = " << _a;
+          else              desc << "general case with p = " << _p << " q = " << _q << " omega = " << _a; 
+          break;
+        // older variants
+        case FlavNeutraliser::sinh_delta_R:
+          desc << "sinh_delta_R" << nm; break;
+        case FlavNeutraliser::delta_R:
+          desc << "delta_R" << nm; break;
+        case FlavNeutraliser::jade_delta_R:
+          desc << "jade_delta_R" << nm; break;
+        case FlavNeutraliser::maxscale_delta_R:
+          desc << "maxscale_delta_R" << nm; break;
+        case FlavNeutraliser::phi2_coshy:
+          desc << "phi2_coshy" << nm; break;
+        case FlavNeutraliser::cosphi_coshy:
+          desc << "cosphi_coshy" << nm; break;
+        case FlavNeutraliser::aktlike_pair_refratio:
+          desc << "aktlike_pair_refratio" << nm; break;
+        case FlavNeutraliser::aktlike_pair_dynrefratio:
+          desc << "aktlike_pair_dynrefratio" << nm; break;
+        case FlavNeutraliser::jade:
+          desc << "jade (without correction factor a)" << nm; break;
+        case FlavNeutraliser::jadea2:
+          desc << "jade (with a = 2)" << nm; break;
+        case FlavNeutraliser::maxscale:
+          desc << "maxscale"; break;
+        default:
+          desc << "UNRECOGNISED";
+    }
+  }
+  desc << ", with modulo_2 = " << _modulo_2;
+  desc << " and recursive = " << recursive();
+  return desc.str();
+}
+
+void IFNPlugin::check_mod2_consistency() const {
+
+  // a check that modulo 2 expectations are consistent with the flavour algorithm
+  const auto * flav_recombiner = dynamic_cast<const FlavRecombiner*>(_jet_def.recombiner());
+  if (flav_recombiner)  {
+    if (_modulo_2) {
+      if (flav_recombiner->flav_summation() != FlavRecombiner::modulo_2) throw Error(
+                    "IFNPlugin modulo_2 is set to true, but base jet "
+                    "definition (" + _jet_def.description() + 
+                    ") has a FlavRecombiner with flav_summation != modulo_2");
+    } else {
+      if (flav_recombiner->flav_summation() != FlavRecombiner::net) throw Error(
+                  "IFNPlugin modulo_2 is set to false, but base jet definition ()"
+                   + _jet_def.description() + 
+                  ") has a FlavRecombiner with flav_summation != net");
+    }
+  }
+
+}
+
+//---------------------------------------------------------------
+void IFNPlugin::run_clustering(ClusterSequence & cs) const {
+
+  // take the initial particles from the cs that gets passed to
+  // (which is a cs that has not yet undergone any clustering)
+  // and cluster them with the jet definition that was used
+  // to construct the IFNPlugin.
+
+  // need to make sure all jets have FlavHistory and that their indices are
+  // correct
+  for (unsigned i = 0; i < cs.jets().size(); i++) {
+
+    const PseudoJet & jet = cs.jets()[i];
+    int hist_index = jet.cluster_hist_index();
+    if (jet.has_user_info<FlavInfo>()) {
+      /// it can be useful to be able to start from a FlavInfo
+      cs.plugin_non_const_jet(i).set_user_info(new FlavHistory(jet.user_info<FlavInfo>(), hist_index));
+      if (_modulo_2) {
+        dynamic_cast<FlavHistory *>(
+            cs.plugin_non_const_jet(i).user_info_shared_ptr().get())
+            ->apply_modulo_2();
+      }
+    } else if (jet.has_user_info<FlavHistory>()) {
+
+      // if we start from a FlavHistory, make sure that we copy the
+      // object, copy its current_flavour and assign this CS's
+      // hist_index. 
+      //
+      // Taking a copy of the FlavHistory object ensures that if the
+      // underlying PseudoJet is going to be used for other clusterings,
+      // then we don't end up sharing a single FlavHistory object among
+      // them (which would inevitably corrupt the FlavHistory of at
+      // least one of the CS's).
+      //
+      // NB: if the user info is multiply derived (e.g. more than just
+      // FlavHistory) then the other info will be lost; we still need to
+      // think about how best to handle that scenario (possibly
+      // introduce UserInfoCopyableBase in FJ with a generic copy() member?)
+      cs.plugin_non_const_jet(i).set_user_info(new FlavHistory(
+          jet.user_info<FlavHistory>().current_flavour(), hist_index));
+
+      if (_modulo_2) {
+        dynamic_cast<FlavHistory *>(
+            cs.plugin_non_const_jet(i).user_info_shared_ptr().get())
+            ->apply_modulo_2();
+      }
+    } else {
+      throw fastjet::Error(
+          "A PseudoJet being clustered with IFNPlugin had neither "
+          "FlavInfo nor FlavHistory user_info.");
+    }
+  }
+
+  ClusterSequence local_cs(cs.jets(), _jet_def);
+
+  typedef ClusterSequence CS;
+
+  /// get the neutralised jets
+  FlavNeutraliser flav_neutraliser(_p, _q, _a, _modulo_2, _measure_in, _use_mass_flav, _spherical_algo, _pp);
+  //FlavNeutraliser flav_neutraliser(_modulo_2, _measure_in, _use_mass_flav, _spherical_algo, _pp);
+  flav_neutraliser.set_recursive(recursive());
+  vector<PseudoJet> jets = flav_neutraliser.neutralise(local_cs);
+  //const auto & jets = local_cs.jets();
+
+  // transfer the neutralised version of the input particles to our
+  // native CS.
+  for (unsigned i = 0; i < cs.jets().size(); i++){
+    cs.plugin_non_const_jet(i).set_user_info_shared_ptr(jets[i].user_info_shared_ptr());
+  }
+
+  const vector<ClusterSequence::history_element> & hist = local_cs.history();
+
+  // Loop over each step of the clusterings to register the neutralised
+  // PseudoJets and their clustering in our history.
+  for (unsigned ih_step = 0; ih_step < hist.size(); ++ih_step) {
+    const auto & h = hist[ih_step];
+    if (h.parent1 == CS::InexistentParent && h.parent2 == CS::InexistentParent) {
+      // this signifies an initial particle, so there is nothing to do.
+      continue;
+    } else if (h.parent1 >= 0 && h.parent2 == CS::BeamJet) {
+      cs.plugin_record_iB_recombination(hist[h.parent1].jetp_index, h.dij);
+    } else if (h.parent1 >= 0 && h.parent2 >= 0) {
+      int newjet_k;
+      cs.plugin_record_ij_recombination(
+          hist[h.parent1].jetp_index,
+          hist[h.parent2].jetp_index,
+          h.dij,
+          jets[h.jetp_index],
+          newjet_k
+          );
+    } else {
+      throw Error("Invalid h.parent1 and h.parent2 combination");
+    }
+  }
+}
+
+} // namespace contrib
+
+FASTJET_END_NAMESPACE
Index: contrib/contribs/IFNPlugin/trunk/example-IFN.ref
===================================================================
--- contrib/contribs/IFNPlugin/trunk/example-IFN.ref	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/example-IFN.ref	(revision 1447)
@@ -0,0 +1,2698 @@
+#--------------------------------------------------------------------------
+#                         FastJet release 3.4.2
+#                 M. Cacciari, G.P. Salam and G. Soyez                  
+#     A software package for jet finding and analysis at colliders      
+#                           http://fastjet.fr                           
+#	                                                                      
+# Please cite EPJC72(2012)1896 [arXiv:1111.6097] if you use this package
+# for scientific work and optionally PLB641(2006)57 [hep-ph/0512210].   
+#                                                                       
+# FastJet is provided without warranty under the GNU GPL v2 or higher.  
+# It uses T. Chan's closest pair algorithm, S. Fortune's Voronoi code
+# and 3rd party plugin jet algorithms. See COPYING file for details.
+#--------------------------------------------------------------------------
+base jet definition: Longitudinally invariant anti-kt algorithm with R = 0.4 and E scheme recombination and net_flav flavour recombination 
+IFN jet definition:  Interleaved Flavour Neutralisation (IFN) plugin based on Longitudinally invariant anti-kt algorithm with R = 0.4 and E scheme recombination and net_flav flavour recombination , using a standard uij  neutralisation measure with alpha = 2, omega = 1, with modulo_2 = 0 and recursive = 1
+
+#---------------------------------------------------------------
+# read event 0 with 64 particles
+
+base jet 0: pt=160.77 rap=0.90783 phi=0.366217, flav = [u ]
+IFN jet  0: pt=160.77 rap=0.90783 phi=0.366217, flav = [u ]
+constituents:
+  pt =    114.031, orig. flav =     [u ], final flav =     [u ]
+  pt =    24.5336, orig. flav =      [g], final flav =      [g]
+  pt =    11.6832, orig. flav =      [g], final flav =      [g]
+  pt =    7.65296, orig. flav =      [g], final flav =      [g]
+  pt =    3.02296, orig. flav =      [g], final flav =      [g]
+  pt =   0.241429, orig. flav =      [g], final flav =      [g]
+
+base jet 1: pt=8.49978 rap=0.550912 phi=0.0241549, flav = [d u ]
+IFN jet  1: pt=8.49978 rap=0.550912 phi=0.0241549, flav = [d u ]
+constituents:
+  pt =    4.47811, orig. flav =     [u ], final flav =     [u ]
+  pt =    3.05929, orig. flav =      [g], final flav =      [g]
+  pt =   0.991028, orig. flav =     [d ], final flav =     [d ]
+
+base jet 2: pt=7.96449 rap=1.98751 phi=4.56023, flav = [bbar bbar ]
+IFN jet  2: pt=7.96449 rap=1.98751 phi=4.56023, flav = [bbar bbar ]
+constituents:
+  pt =    4.19673, orig. flav =  [bbar ], final flav =  [bbar ]
+  pt =    3.11948, orig. flav =  [bbar ], final flav =  [bbar ]
+  pt =   0.662626, orig. flav =      [g], final flav =      [g]
+
+base jet 3: pt=7.44626 rap=0.0690523 phi=0.605221, flav = [u s ]
+IFN jet  3: pt=7.44626 rap=0.0690523 phi=0.605221, flav = [u s ]
+constituents:
+  pt =    4.07363, orig. flav =     [u ], final flav =     [u ]
+  pt =    2.97687, orig. flav =      [g], final flav =      [g]
+  pt =   0.401654, orig. flav =     [s ], final flav =     [s ]
+
+base jet 4: pt=7.3402 rap=0.00843489 phi=1.28811, flav = [dbar ubar ]
+IFN jet  4: pt=7.3402 rap=0.00843489 phi=1.28811, flav = [ubar ]
+constituents:
+  pt =     4.4678, orig. flav =      [g], final flav =      [g]
+  pt =    2.07394, orig. flav =  [ubar ], final flav =  [ubar ]
+  pt =   0.482026, orig. flav =  [dbar ], final flav =      [g]
+  pt =   0.382845, orig. flav =      [g], final flav =      [g]
+
+base jet 5: pt=3.27161 rap=-0.407406 phi=4.65289, flav = [g]
+IFN jet  5: pt=3.27161 rap=-0.407406 phi=4.65289, flav = [g]
+constituents:
+  pt =    2.50909, orig. flav =      [g], final flav =      [g]
+  pt =   0.763508, orig. flav =      [g], final flav =      [g]
+
+base jet 6: pt=3.21146 rap=0.501387 phi=4.22762, flav = [g]
+IFN jet  6: pt=3.21146 rap=0.501387 phi=4.22762, flav = [g]
+constituents:
+  pt =    2.61083, orig. flav =      [g], final flav =      [g]
+  pt =   0.614037, orig. flav =      [g], final flav =      [g]
+
+base jet 7: pt=2.96585 rap=3.85741 phi=5.05258, flav = [d ]
+IFN jet  7: pt=2.96585 rap=3.85741 phi=5.05258, flav = [d ]
+constituents:
+  pt =    2.96585, orig. flav =     [d ], final flav =     [d ]
+
+base jet 8: pt=2.84607 rap=1.24282 phi=1.60851, flav = [sbar ]
+IFN jet  8: pt=2.84607 rap=1.24282 phi=1.60851, flav = [sbar ]
+constituents:
+  pt =    2.27791, orig. flav =      [g], final flav =      [g]
+  pt =   0.341298, orig. flav =      [g], final flav =      [g]
+  pt =   0.238383, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 9: pt=1.94069 rap=1.56491 phi=4.28638, flav = [g]
+IFN jet  9: pt=1.94069 rap=1.56491 phi=4.28638, flav = [g]
+constituents:
+  pt =    1.94069, orig. flav =      [g], final flav =      [g]
+
+base jet 10: pt=1.87908 rap=3.51836 phi=5.38263, flav = [dbar ]
+IFN jet  10: pt=1.87908 rap=3.51836 phi=5.38263, flav = [dbar ]
+constituents:
+  pt =    1.87908, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 11: pt=1.82013 rap=1.72083 phi=1.98468, flav = [g]
+IFN jet  11: pt=1.82013 rap=1.72083 phi=1.98468, flav = [g]
+constituents:
+  pt =    1.82013, orig. flav =      [g], final flav =      [g]
+
+base jet 12: pt=1.71472 rap=-0.0741472 phi=3.83835, flav = [g]
+IFN jet  12: pt=1.71472 rap=-0.0741472 phi=3.83835, flav = [g]
+constituents:
+  pt =    1.71472, orig. flav =      [g], final flav =      [g]
+
+base jet 13: pt=1.45959 rap=0.180121 phi=0.199993, flav = [cbar ]
+IFN jet  13: pt=1.45959 rap=0.180121 phi=0.199993, flav = [cbar ]
+constituents:
+  pt =    1.45959, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 14: pt=1.44142 rap=-2.62404 phi=3.36924, flav = [sbar ]
+IFN jet  14: pt=1.44142 rap=-2.62404 phi=3.36924, flav = [sbar ]
+constituents:
+  pt =    1.44142, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 15: pt=1.23947 rap=6.23036 phi=4.31063, flav = [d u ]
+IFN jet  15: pt=1.23947 rap=6.23036 phi=4.31063, flav = [d u ]
+constituents:
+  pt =    1.23947, orig. flav =   [d u ], final flav =   [d u ]
+
+base jet 16: pt=1.21019 rap=-1.34209 phi=4.33514, flav = [bbar ]
+IFN jet  16: pt=1.21019 rap=-1.34209 phi=4.33514, flav = [bbar ]
+constituents:
+  pt =    1.21019, orig. flav =  [bbar ], final flav =  [bbar ]
+
+base jet 17: pt=1.16347 rap=-0.368498 phi=2.92186, flav = [cbar ]
+IFN jet  17: pt=1.16347 rap=-0.368498 phi=2.92186, flav = [cbar ]
+constituents:
+  pt =   0.973153, orig. flav =      [g], final flav =      [g]
+  pt =   0.191189, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 18: pt=1.15743 rap=0.113967 phi=5.07935, flav = [g]
+IFN jet  18: pt=1.15743 rap=0.113967 phi=5.07935, flav = [g]
+constituents:
+  pt =    1.15743, orig. flav =      [g], final flav =      [g]
+
+base jet 19: pt=1.06287 rap=1.22708 phi=2.585, flav = [c ]
+IFN jet  19: pt=1.06287 rap=1.22708 phi=2.585, flav = [c ]
+constituents:
+  pt =    1.06284, orig. flav =     [c ], final flav =     [c ]
+  pt = 3.2513e-05, orig. flav =      [g], final flav =      [g]
+
+base jet 20: pt=1.02474 rap=-2.46634 phi=4.40107, flav = [g]
+IFN jet  20: pt=1.02474 rap=-2.46634 phi=4.40107, flav = [g]
+constituents:
+  pt =    1.02474, orig. flav =      [g], final flav =      [g]
+
+base jet 21: pt=0.853336 rap=-0.301915 phi=1.00563, flav = [d ]
+IFN jet  21: pt=0.853336 rap=-0.301915 phi=1.00563, flav = [g]
+constituents:
+  pt =   0.853336, orig. flav =     [d ], final flav =      [g]
+
+base jet 22: pt=0.769826 rap=-0.786678 phi=4.07458, flav = [u ]
+IFN jet  22: pt=0.769826 rap=-0.786678 phi=4.07458, flav = [u ]
+constituents:
+  pt =   0.462864, orig. flav =     [u ], final flav =     [u ]
+  pt =   0.314516, orig. flav =      [g], final flav =      [g]
+
+base jet 23: pt=0.760885 rap=0.633055 phi=0.678284, flav = [g]
+IFN jet  23: pt=0.760885 rap=0.633055 phi=0.678284, flav = [g]
+constituents:
+  pt =   0.760885, orig. flav =      [g], final flav =      [g]
+
+base jet 24: pt=0.67701 rap=2.89705 phi=5.54088, flav = [g]
+IFN jet  24: pt=0.67701 rap=2.89705 phi=5.54088, flav = [g]
+constituents:
+  pt =    0.67701, orig. flav =      [g], final flav =      [g]
+
+base jet 25: pt=0.630838 rap=-1.60383 phi=3.31619, flav = [g]
+IFN jet  25: pt=0.630838 rap=-1.60383 phi=3.31619, flav = [g]
+constituents:
+  pt =   0.630838, orig. flav =      [g], final flav =      [g]
+
+base jet 26: pt=0.576939 rap=-7.47203 phi=4.25877, flav = [d u ]
+IFN jet  26: pt=0.576939 rap=-7.47203 phi=4.25877, flav = [d u ]
+constituents:
+  pt =   0.576939, orig. flav =   [d u ], final flav =   [d u ]
+
+base jet 27: pt=0.512529 rap=-2.37706 phi=1.70759, flav = [g]
+IFN jet  27: pt=0.512529 rap=-2.37706 phi=1.70759, flav = [g]
+constituents:
+  pt =   0.512529, orig. flav =      [g], final flav =      [g]
+
+base jet 28: pt=0.50689 rap=0.940743 phi=5.67736, flav = [g]
+IFN jet  28: pt=0.50689 rap=0.940743 phi=5.67736, flav = [g]
+constituents:
+  pt =    0.50689, orig. flav =      [g], final flav =      [g]
+
+base jet 29: pt=0.481995 rap=-1.11306 phi=2.77235, flav = [g]
+IFN jet  29: pt=0.481995 rap=-1.11306 phi=2.77235, flav = [g]
+constituents:
+  pt =   0.481995, orig. flav =      [g], final flav =      [g]
+
+base jet 30: pt=0.44368 rap=1.07817 phi=4.91583, flav = [g]
+IFN jet  30: pt=0.44368 rap=1.07817 phi=4.91583, flav = [g]
+constituents:
+  pt =    0.44368, orig. flav =      [g], final flav =      [g]
+
+base jet 31: pt=0.439767 rap=3.6931 phi=1.64782, flav = [c ]
+IFN jet  31: pt=0.439767 rap=3.6931 phi=1.64782, flav = [c ]
+constituents:
+  pt =   0.439767, orig. flav =     [c ], final flav =     [c ]
+
+base jet 32: pt=0.417598 rap=-1.75011 phi=0.660275, flav = [d ]
+IFN jet  32: pt=0.417598 rap=-1.75011 phi=0.660275, flav = [d ]
+constituents:
+  pt =   0.304438, orig. flav =      [g], final flav =      [g]
+  pt =   0.116765, orig. flav =     [d ], final flav =     [d ]
+
+base jet 33: pt=0.388286 rap=-6.47478 phi=0.45092, flav = [u ]
+IFN jet  33: pt=0.388286 rap=-6.47478 phi=0.45092, flav = [u ]
+constituents:
+  pt =   0.388286, orig. flav =     [u ], final flav =     [u ]
+
+base jet 34: pt=0.386049 rap=1.39697 phi=0.0759585, flav = [dbar ]
+IFN jet  34: pt=0.386049 rap=1.39697 phi=0.0759585, flav = [dbar ]
+constituents:
+  pt =   0.386049, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 35: pt=0.328926 rap=0.0540854 phi=6.06608, flav = [g]
+IFN jet  35: pt=0.328926 rap=0.0540854 phi=6.06608, flav = [g]
+constituents:
+  pt =   0.328926, orig. flav =      [g], final flav =      [g]
+
+base jet 36: pt=0.318562 rap=2.26857 phi=2.89181, flav = [u ]
+IFN jet  36: pt=0.318562 rap=2.26857 phi=2.89181, flav = [u ]
+constituents:
+  pt =   0.318562, orig. flav =     [u ], final flav =     [u ]
+
+base jet 37: pt=0.249964 rap=-0.616062 phi=2.05125, flav = [g]
+IFN jet  37: pt=0.249964 rap=-0.616062 phi=2.05125, flav = [g]
+constituents:
+  pt =   0.249964, orig. flav =      [g], final flav =      [g]
+
+base jet 38: pt=0.247897 rap=2.10803 phi=5.56523, flav = [bbar ]
+IFN jet  38: pt=0.247897 rap=2.10803 phi=5.56523, flav = [bbar ]
+constituents:
+  pt =   0.247897, orig. flav =  [bbar ], final flav =  [bbar ]
+
+base jet 39: pt=0.222556 rap=0.768118 phi=1.34336, flav = [g]
+IFN jet  39: pt=0.222556 rap=0.768118 phi=1.34336, flav = [g]
+constituents:
+  pt =   0.222556, orig. flav =      [g], final flav =      [g]
+
+base jet 40: pt=0.0517697 rap=-1.69026 phi=4.56152, flav = [g]
+IFN jet  40: pt=0.0517697 rap=-1.69026 phi=4.56152, flav = [g]
+constituents:
+  pt =  0.0517697, orig. flav =      [g], final flav =      [g]
+
+base jet 41: pt=0.00736101 rap=0.780826 phi=3.63937, flav = [g]
+IFN jet  41: pt=0.00736101 rap=0.780826 phi=3.63937, flav = [g]
+constituents:
+  pt = 0.00736101, orig. flav =      [g], final flav =      [g]
+
+#---------------------------------------------------------------
+# read event 1 with 91 particles
+
+base jet 0: pt=143.136 rap=1.00816 phi=0.315751, flav = [bbar tbar ]
+IFN jet  0: pt=143.136 rap=1.00816 phi=0.315751, flav = [g]
+constituents:
+  pt =     108.45, orig. flav =  [dbar ], final flav =  [dbar ]
+  pt =    20.9132, orig. flav =     [d ], final flav =     [d ]
+  pt =    7.55253, orig. flav =  [bbar ], final flav =      [g]
+  pt =     6.1231, orig. flav =      [g], final flav =      [g]
+  pt =   0.428857, orig. flav =  [tbar ], final flav =      [g]
+
+base jet 1: pt=6.05867 rap=0.0649657 phi=3.29464, flav = [g]
+IFN jet  1: pt=6.05867 rap=0.0649657 phi=3.29464, flav = [g]
+constituents:
+  pt =    6.05867, orig. flav =      [g], final flav =      [g]
+
+base jet 2: pt=3.58636 rap=0.193706 phi=5.36693, flav = [d ]
+IFN jet  2: pt=3.58636 rap=0.193706 phi=5.36693, flav = [d ]
+constituents:
+  pt =    3.58636, orig. flav =     [d ], final flav =     [d ]
+
+base jet 3: pt=3.49044 rap=-0.149006 phi=0.716449, flav = [d b ]
+IFN jet  3: pt=3.49044 rap=-0.149006 phi=0.716449, flav = [d ]
+constituents:
+  pt =     2.2083, orig. flav =     [d ], final flav =     [d ]
+  pt =    1.29322, orig. flav =     [b ], final flav =      [g]
+
+base jet 4: pt=3.41124 rap=2.29203 phi=3.90154, flav = [g]
+IFN jet  4: pt=3.41124 rap=2.29203 phi=3.90154, flav = [g]
+constituents:
+  pt =    2.69181, orig. flav =      [g], final flav =      [g]
+  pt =   0.391893, orig. flav =      [g], final flav =      [g]
+  pt =    0.33422, orig. flav =      [g], final flav =      [g]
+
+base jet 5: pt=3.01848 rap=3.14716 phi=5.74679, flav = [g]
+IFN jet  5: pt=3.01848 rap=3.14716 phi=5.74679, flav = [g]
+constituents:
+  pt =    3.01848, orig. flav =      [g], final flav =      [g]
+
+base jet 6: pt=2.82862 rap=-3.73093 phi=1.35695, flav = [d ]
+IFN jet  6: pt=2.82862 rap=-3.73093 phi=1.35695, flav = [d ]
+constituents:
+  pt =    2.56255, orig. flav =      [g], final flav =      [g]
+  pt =   0.266146, orig. flav =     [d ], final flav =     [d ]
+
+base jet 7: pt=2.80011 rap=-0.469935 phi=2.60928, flav = [s ]
+IFN jet  7: pt=2.80011 rap=-0.469935 phi=2.60928, flav = [s ]
+constituents:
+  pt =    2.01037, orig. flav =     [s ], final flav =     [s ]
+  pt =   0.809622, orig. flav =      [g], final flav =      [g]
+
+base jet 8: pt=2.77666 rap=0.391043 phi=6.2483, flav = [s c ]
+IFN jet  8: pt=2.77666 rap=0.391043 phi=6.2483, flav = [s c ]
+constituents:
+  pt =    1.13492, orig. flav =     [c ], final flav =     [c ]
+  pt =   0.937829, orig. flav =     [s ], final flav =     [s ]
+  pt =   0.750851, orig. flav =      [g], final flav =      [g]
+
+base jet 9: pt=2.77306 rap=2.38653 phi=6.2755, flav = [d u ]
+IFN jet  9: pt=2.77306 rap=2.38653 phi=6.2755, flav = [d u ]
+constituents:
+  pt =    2.25214, orig. flav =     [d ], final flav =     [d ]
+  pt =   0.521758, orig. flav =     [u ], final flav =     [u ]
+
+base jet 10: pt=2.68261 rap=-1.97425 phi=3.65305, flav = [u ]
+IFN jet  10: pt=2.68261 rap=-1.97425 phi=3.65305, flav = [u ]
+constituents:
+  pt =    2.49986, orig. flav =     [u ], final flav =     [u ]
+  pt =   0.183492, orig. flav =      [g], final flav =      [g]
+
+base jet 11: pt=2.61389 rap=-1.62422 phi=0.381118, flav = [s ]
+IFN jet  11: pt=2.61389 rap=-1.62422 phi=0.381118, flav = [s ]
+constituents:
+  pt =    2.61389, orig. flav =     [s ], final flav =     [s ]
+
+base jet 12: pt=2.29673 rap=-2.33543 phi=5.56451, flav = [g]
+IFN jet  12: pt=2.29673 rap=-2.33543 phi=5.56451, flav = [g]
+constituents:
+  pt =    1.66747, orig. flav =      [g], final flav =      [g]
+  pt =   0.640752, orig. flav =      [g], final flav =      [g]
+
+base jet 13: pt=2.06971 rap=-3.70133 phi=4.17462, flav = [g]
+IFN jet  13: pt=2.06971 rap=-3.70133 phi=4.17462, flav = [g]
+constituents:
+  pt =    2.06971, orig. flav =      [g], final flav =      [g]
+
+base jet 14: pt=1.92048 rap=0.53675 phi=0.960671, flav = [sbar ]
+IFN jet  14: pt=1.92048 rap=0.53675 phi=0.960671, flav = [sbar ]
+constituents:
+  pt =    1.61666, orig. flav =  [sbar ], final flav =  [sbar ]
+  pt =   0.308706, orig. flav =      [g], final flav =      [g]
+
+base jet 15: pt=1.92 rap=-3.26105 phi=2.39568, flav = [cbar ]
+IFN jet  15: pt=1.92 rap=-3.26105 phi=2.39568, flav = [cbar ]
+constituents:
+  pt =     1.2742, orig. flav =      [g], final flav =      [g]
+  pt =   0.645797, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 16: pt=1.48458 rap=1.55754 phi=2.47298, flav = [g]
+IFN jet  16: pt=1.48458 rap=1.55754 phi=2.47298, flav = [g]
+constituents:
+  pt =   0.953865, orig. flav =  [dbar ], final flav =  [dbar ]
+  pt =   0.543457, orig. flav =     [d ], final flav =     [d ]
+
+base jet 17: pt=1.44491 rap=1.68236 phi=4.80464, flav = [dbar ]
+IFN jet  17: pt=1.44491 rap=1.68236 phi=4.80464, flav = [dbar ]
+constituents:
+  pt =    1.44491, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 18: pt=1.38599 rap=0.335099 phi=4.26118, flav = [b ]
+IFN jet  18: pt=1.38599 rap=0.335099 phi=4.26118, flav = [g]
+constituents:
+  pt =   0.735846, orig. flav =      [g], final flav =      [g]
+  pt =   0.453002, orig. flav =      [g], final flav =      [g]
+  pt =   0.210092, orig. flav =     [b ], final flav =      [g]
+
+base jet 19: pt=1.35669 rap=4.20634 phi=2.47973, flav = [d ]
+IFN jet  19: pt=1.35669 rap=4.20634 phi=2.47973, flav = [d ]
+constituents:
+  pt =    1.35669, orig. flav =     [d ], final flav =     [d ]
+
+base jet 20: pt=1.22377 rap=2.75199 phi=5.85133, flav = [dbar ]
+IFN jet  20: pt=1.22377 rap=2.75199 phi=5.85133, flav = [dbar ]
+constituents:
+  pt =    1.22377, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 21: pt=1.18313 rap=2.81888 phi=0.313522, flav = [g]
+IFN jet  21: pt=1.18313 rap=2.81888 phi=0.313522, flav = [g]
+constituents:
+  pt =    1.18313, orig. flav =      [g], final flav =      [g]
+
+base jet 22: pt=1.17584 rap=-0.493954 phi=3.58193, flav = [g]
+IFN jet  22: pt=1.17584 rap=-0.493954 phi=3.58193, flav = [g]
+constituents:
+  pt =    1.17584, orig. flav =      [g], final flav =      [g]
+
+base jet 23: pt=1.11816 rap=-2.10896 phi=0.526007, flav = [b ]
+IFN jet  23: pt=1.11816 rap=-2.10896 phi=0.526007, flav = [g]
+constituents:
+  pt =    1.11816, orig. flav =     [b ], final flav =      [g]
+
+base jet 24: pt=1.08848 rap=-1.34539 phi=1.07665, flav = [g]
+IFN jet  24: pt=1.08848 rap=-1.34539 phi=1.07665, flav = [g]
+constituents:
+  pt =    1.08848, orig. flav =      [g], final flav =      [g]
+
+base jet 25: pt=1.07877 rap=-4.11914 phi=4.3603, flav = [d ]
+IFN jet  25: pt=1.07877 rap=-4.11914 phi=4.3603, flav = [d ]
+constituents:
+  pt =    1.07877, orig. flav =     [d ], final flav =     [d ]
+
+base jet 26: pt=0.953084 rap=-1.50513 phi=3.0102, flav = [g]
+IFN jet  26: pt=0.953084 rap=-1.50513 phi=3.0102, flav = [g]
+constituents:
+  pt =   0.953084, orig. flav =      [g], final flav =      [g]
+
+base jet 27: pt=0.945861 rap=-5.4698 phi=6.12483, flav = [d ]
+IFN jet  27: pt=0.945861 rap=-5.4698 phi=6.12483, flav = [d ]
+constituents:
+  pt =   0.945861, orig. flav =     [d ], final flav =     [d ]
+
+base jet 28: pt=0.878457 rap=2.69632 phi=2.31983, flav = [sbar ]
+IFN jet  28: pt=0.878457 rap=2.69632 phi=2.31983, flav = [sbar ]
+constituents:
+  pt =   0.878457, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 29: pt=0.873632 rap=0.190396 phi=2.56701, flav = [bbar ]
+IFN jet  29: pt=0.873632 rap=0.190396 phi=2.56701, flav = [g]
+constituents:
+  pt =   0.482919, orig. flav =  [bbar ], final flav =      [g]
+  pt =   0.396541, orig. flav =      [g], final flav =      [g]
+
+base jet 30: pt=0.856031 rap=1.2279 phi=4.62162, flav = [tbar tbar ]
+IFN jet  30: pt=0.856031 rap=1.2279 phi=4.62162, flav = [tbar ]
+constituents:
+  pt =   0.494308, orig. flav =  [tbar ], final flav =  [tbar ]
+  pt =   0.363351, orig. flav =  [tbar ], final flav =      [g]
+
+base jet 31: pt=0.852897 rap=-0.654192 phi=1.43833, flav = [d s ]
+IFN jet  31: pt=0.852897 rap=-0.654192 phi=1.43833, flav = [d s ]
+constituents:
+  pt =   0.770177, orig. flav =     [d ], final flav =     [d ]
+  pt =  0.0856672, orig. flav =     [s ], final flav =     [s ]
+
+base jet 32: pt=0.782025 rap=-3.82596 phi=5.01091, flav = [sbar ]
+IFN jet  32: pt=0.782025 rap=-3.82596 phi=5.01091, flav = [sbar ]
+constituents:
+  pt =   0.782025, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 33: pt=0.779432 rap=-1.7142 phi=5.49623, flav = [sbar ]
+IFN jet  33: pt=0.779432 rap=-1.7142 phi=5.49623, flav = [sbar ]
+constituents:
+  pt =    0.53115, orig. flav =  [sbar ], final flav =  [sbar ]
+  pt =   0.253966, orig. flav =      [g], final flav =      [g]
+
+base jet 34: pt=0.771015 rap=4.3702 phi=1.83947, flav = [d ]
+IFN jet  34: pt=0.771015 rap=4.3702 phi=1.83947, flav = [d ]
+constituents:
+  pt =   0.771015, orig. flav =     [d ], final flav =     [d ]
+
+base jet 35: pt=0.759793 rap=-4.63334 phi=0.348931, flav = [g]
+IFN jet  35: pt=0.759793 rap=-4.63334 phi=0.348931, flav = [g]
+constituents:
+  pt =   0.759793, orig. flav =      [g], final flav =      [g]
+
+base jet 36: pt=0.743978 rap=-1.25191 phi=4.17609, flav = [t ]
+IFN jet  36: pt=0.743978 rap=-1.25191 phi=4.17609, flav = [g]
+constituents:
+  pt =   0.375902, orig. flav =     [t ], final flav =      [g]
+  pt =    0.36837, orig. flav =      [g], final flav =      [g]
+
+base jet 37: pt=0.728298 rap=3.25587 phi=2.61844, flav = [ubar ]
+IFN jet  37: pt=0.728298 rap=3.25587 phi=2.61844, flav = [ubar ]
+constituents:
+  pt =   0.728298, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 38: pt=0.719598 rap=-2.11331 phi=2.20152, flav = [g]
+IFN jet  38: pt=0.719598 rap=-2.11331 phi=2.20152, flav = [g]
+constituents:
+  pt =   0.719598, orig. flav =      [g], final flav =      [g]
+
+base jet 39: pt=0.682855 rap=-1.90111 phi=1.64187, flav = [g]
+IFN jet  39: pt=0.682855 rap=-1.90111 phi=1.64187, flav = [g]
+constituents:
+  pt =   0.682855, orig. flav =      [g], final flav =      [g]
+
+base jet 40: pt=0.668062 rap=-3.55152 phi=3.41624, flav = [g]
+IFN jet  40: pt=0.668062 rap=-3.55152 phi=3.41624, flav = [g]
+constituents:
+  pt =   0.668062, orig. flav =      [g], final flav =      [g]
+
+base jet 41: pt=0.611448 rap=3.3453 phi=3.75899, flav = [dbar ]
+IFN jet  41: pt=0.611448 rap=3.3453 phi=3.75899, flav = [dbar ]
+constituents:
+  pt =   0.611448, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 42: pt=0.591053 rap=7.16017 phi=1.91984, flav = [u ]
+IFN jet  42: pt=0.591053 rap=7.16017 phi=1.91984, flav = [u ]
+constituents:
+  pt =   0.591053, orig. flav =     [u ], final flav =     [u ]
+
+base jet 43: pt=0.558173 rap=-4.24347 phi=3.66288, flav = [dbar ]
+IFN jet  43: pt=0.558173 rap=-4.24347 phi=3.66288, flav = [dbar ]
+constituents:
+  pt =   0.558173, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 44: pt=0.487133 rap=2.1083 phi=2.35829, flav = [g]
+IFN jet  44: pt=0.487133 rap=2.1083 phi=2.35829, flav = [g]
+constituents:
+  pt =   0.487133, orig. flav =      [g], final flav =      [g]
+
+base jet 45: pt=0.453849 rap=1.60355 phi=5.26047, flav = [g]
+IFN jet  45: pt=0.453849 rap=1.60355 phi=5.26047, flav = [g]
+constituents:
+  pt =   0.453849, orig. flav =      [g], final flav =      [g]
+
+base jet 46: pt=0.431865 rap=5.46715 phi=3.61077, flav = [u ]
+IFN jet  46: pt=0.431865 rap=5.46715 phi=3.61077, flav = [u ]
+constituents:
+  pt =   0.431865, orig. flav =     [u ], final flav =     [u ]
+
+base jet 47: pt=0.429176 rap=-1.22649 phi=2.33468, flav = [g]
+IFN jet  47: pt=0.429176 rap=-1.22649 phi=2.33468, flav = [g]
+constituents:
+  pt =   0.429176, orig. flav =      [g], final flav =      [g]
+
+base jet 48: pt=0.391055 rap=-2.77206 phi=1.33661, flav = [t ]
+IFN jet  48: pt=0.391055 rap=-2.77206 phi=1.33661, flav = [g]
+constituents:
+  pt =   0.391055, orig. flav =     [t ], final flav =      [g]
+
+base jet 49: pt=0.370242 rap=-2.85766 phi=4.76131, flav = [g]
+IFN jet  49: pt=0.370242 rap=-2.85766 phi=4.76131, flav = [g]
+constituents:
+  pt =   0.370242, orig. flav =      [g], final flav =      [g]
+
+base jet 50: pt=0.361895 rap=1.96591 phi=3.55174, flav = [s ]
+IFN jet  50: pt=0.361895 rap=1.96591 phi=3.55174, flav = [s ]
+constituents:
+  pt =   0.361895, orig. flav =     [s ], final flav =     [s ]
+
+base jet 51: pt=0.361562 rap=-1.46941 phi=1.61668, flav = [g]
+IFN jet  51: pt=0.361562 rap=-1.46941 phi=1.61668, flav = [g]
+constituents:
+  pt =   0.361562, orig. flav =      [g], final flav =      [g]
+
+base jet 52: pt=0.352232 rap=0.692781 phi=2.85168, flav = [g]
+IFN jet  52: pt=0.352232 rap=0.692781 phi=2.85168, flav = [g]
+constituents:
+  pt =   0.352232, orig. flav =      [g], final flav =      [g]
+
+base jet 53: pt=0.345302 rap=-5.77666 phi=5.7911, flav = [c ]
+IFN jet  53: pt=0.345302 rap=-5.77666 phi=5.7911, flav = [c ]
+constituents:
+  pt =   0.345302, orig. flav =     [c ], final flav =     [c ]
+
+base jet 54: pt=0.297851 rap=2.7629 phi=1.8896, flav = [d ]
+IFN jet  54: pt=0.297851 rap=2.7629 phi=1.8896, flav = [g]
+constituents:
+  pt =   0.297851, orig. flav =     [d ], final flav =      [g]
+
+base jet 55: pt=0.279278 rap=3.51562 phi=4.97096, flav = [g]
+IFN jet  55: pt=0.279278 rap=3.51562 phi=4.97096, flav = [g]
+constituents:
+  pt =   0.279278, orig. flav =      [g], final flav =      [g]
+
+base jet 56: pt=0.213923 rap=1.06514 phi=1.18679, flav = [dbar ]
+IFN jet  56: pt=0.213923 rap=1.06514 phi=1.18679, flav = [g]
+constituents:
+  pt =   0.213923, orig. flav =  [dbar ], final flav =      [g]
+
+base jet 57: pt=0.213736 rap=-6.54445 phi=5.44883, flav = [d u ]
+IFN jet  57: pt=0.213736 rap=-6.54445 phi=5.44883, flav = [d u ]
+constituents:
+  pt =   0.213736, orig. flav =   [d u ], final flav =   [d u ]
+
+base jet 58: pt=0.202974 rap=-3.2913 phi=1.1752, flav = [ubar ]
+IFN jet  58: pt=0.202974 rap=-3.2913 phi=1.1752, flav = [ubar ]
+constituents:
+  pt =   0.202974, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 59: pt=0.197693 rap=-2.4371 phi=4.07095, flav = [bbar ]
+IFN jet  59: pt=0.197693 rap=-2.4371 phi=4.07095, flav = [g]
+constituents:
+  pt =   0.197693, orig. flav =  [bbar ], final flav =      [g]
+
+base jet 60: pt=0.196554 rap=2.53804 phi=1.55713, flav = [ubar ]
+IFN jet  60: pt=0.196554 rap=2.53804 phi=1.55713, flav = [ubar ]
+constituents:
+  pt =   0.196554, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 61: pt=0.194348 rap=-1.67692 phi=4.83327, flav = [g]
+IFN jet  61: pt=0.194348 rap=-1.67692 phi=4.83327, flav = [g]
+constituents:
+  pt =   0.194348, orig. flav =      [g], final flav =      [g]
+
+base jet 62: pt=0.173009 rap=3.47812 phi=3.29596, flav = [g]
+IFN jet  62: pt=0.173009 rap=3.47812 phi=3.29596, flav = [g]
+constituents:
+  pt =   0.173009, orig. flav =      [g], final flav =      [g]
+
+base jet 63: pt=0.172712 rap=-6.74206 phi=4.07209, flav = [u ]
+IFN jet  63: pt=0.172712 rap=-6.74206 phi=4.07209, flav = [u ]
+constituents:
+  pt =   0.172712, orig. flav =     [u ], final flav =     [u ]
+
+base jet 64: pt=0.159647 rap=-0.65415 phi=4.27448, flav = [g]
+IFN jet  64: pt=0.159647 rap=-0.65415 phi=4.27448, flav = [g]
+constituents:
+  pt =   0.159647, orig. flav =      [g], final flav =      [g]
+
+base jet 65: pt=0.151099 rap=-2.34689 phi=3.37457, flav = [g]
+IFN jet  65: pt=0.151099 rap=-2.34689 phi=3.37457, flav = [g]
+constituents:
+  pt =   0.151099, orig. flav =      [g], final flav =      [g]
+
+base jet 66: pt=0.0642579 rap=-3.11322 phi=1.7564, flav = [g]
+IFN jet  66: pt=0.0642579 rap=-3.11322 phi=1.7564, flav = [g]
+constituents:
+  pt =  0.0642579, orig. flav =      [g], final flav =      [g]
+
+#---------------------------------------------------------------
+# read event 2 with 67 particles
+
+base jet 0: pt=72.6916 rap=0.0676305 phi=6.26665, flav = [dbar u c ]
+IFN jet  0: pt=72.6916 rap=0.0676305 phi=6.26665, flav = [u bbar ]
+constituents:
+  pt =    18.6706, orig. flav =  [bbar ], final flav =  [bbar ]
+  pt =    12.7679, orig. flav =     [d ], final flav =      [g]
+  pt =    10.1756, orig. flav =  [dbar ], final flav =      [g]
+  pt =    8.94454, orig. flav =      [g], final flav =      [g]
+  pt =    7.34392, orig. flav =     [u ], final flav =     [u ]
+  pt =    5.58361, orig. flav =      [g], final flav =      [g]
+  pt =    4.67571, orig. flav =     [b ], final flav =      [g]
+  pt =    2.22102, orig. flav =      [g], final flav =      [g]
+  pt =    2.19169, orig. flav =  [dbar ], final flav =      [g]
+  pt =   0.621727, orig. flav =     [c ], final flav =      [g]
+
+base jet 1: pt=30.4721 rap=-1.2557 phi=1.37855, flav = [ubar bbar t ]
+IFN jet  1: pt=30.4721 rap=-1.2557 phi=1.37855, flav = [ubar t ]
+constituents:
+  pt =     9.5194, orig. flav =      [g], final flav =      [g]
+  pt =    8.99998, orig. flav =     [d ], final flav =     [d ]
+  pt =    4.95131, orig. flav =  [dbar ], final flav =  [dbar ]
+  pt =     3.5341, orig. flav =     [t ], final flav =     [t ]
+  pt =     2.1663, orig. flav =  [ubar ], final flav =  [ubar ]
+  pt =    1.41552, orig. flav =  [bbar ], final flav =      [g]
+
+base jet 2: pt=21.2516 rap=0.467594 phi=5.0756, flav = [cbar cbar ]
+IFN jet  2: pt=21.2516 rap=0.467594 phi=5.0756, flav = [cbar cbar ]
+constituents:
+  pt =    9.83542, orig. flav =  [cbar ], final flav =  [cbar ]
+  pt =    5.38943, orig. flav =      [g], final flav =      [g]
+  pt =    3.31887, orig. flav =     [d ], final flav =      [g]
+  pt =     2.1902, orig. flav =  [cbar ], final flav =  [cbar ]
+  pt =   0.592653, orig. flav =  [dbar ], final flav =      [g]
+
+base jet 3: pt=20.9087 rap=0.858619 phi=5.39029, flav = [ubar ]
+IFN jet  3: pt=20.9087 rap=0.858619 phi=5.39029, flav = [ubar ]
+constituents:
+  pt =    12.2809, orig. flav =  [ubar ], final flav =  [ubar ]
+  pt =    8.06371, orig. flav =     [d ], final flav =      [g]
+  pt =   0.605757, orig. flav =  [dbar ], final flav =      [g]
+
+base jet 4: pt=19.611 rap=1.0372 phi=1.25711, flav = [cbar b t ]
+IFN jet  4: pt=19.611 rap=1.0372 phi=1.25711, flav = [cbar t ]
+constituents:
+  pt =    6.76525, orig. flav =     [t ], final flav =     [t ]
+  pt =    4.53693, orig. flav =  [cbar ], final flav =  [cbar ]
+  pt =    3.26098, orig. flav =      [g], final flav =      [g]
+  pt =    2.40436, orig. flav =      [g], final flav =      [g]
+  pt =    1.65216, orig. flav =      [g], final flav =      [g]
+  pt =    1.25691, orig. flav =     [b ], final flav =      [g]
+
+base jet 5: pt=18.1229 rap=0.951132 phi=6.13624, flav = [cbar cbar bbar ]
+IFN jet  5: pt=18.1229 rap=0.951132 phi=6.13624, flav = [cbar cbar ]
+constituents:
+  pt =    7.16765, orig. flav =  [cbar ], final flav =  [cbar ]
+  pt =    2.72211, orig. flav =      [g], final flav =      [g]
+  pt =    2.54494, orig. flav =      [g], final flav =      [g]
+  pt =    2.29452, orig. flav =  [bbar ], final flav =      [g]
+  pt =    2.28934, orig. flav =      [g], final flav =      [g]
+  pt =    1.28272, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 6: pt=9.64769 rap=-0.34528 phi=5.73185, flav = [cbar ]
+IFN jet  6: pt=9.64769 rap=-0.34528 phi=5.73185, flav = [cbar ]
+constituents:
+  pt =    9.64769, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 7: pt=6.70531 rap=0.415159 phi=0.886058, flav = [u cbar ]
+IFN jet  7: pt=6.70531 rap=0.415159 phi=0.886058, flav = [u ]
+constituents:
+  pt =    6.36857, orig. flav =     [u ], final flav =     [u ]
+  pt =   0.337198, orig. flav =  [cbar ], final flav =      [g]
+
+base jet 8: pt=6.3585 rap=3.17208 phi=3.4689, flav = [sbar ]
+IFN jet  8: pt=6.3585 rap=3.17208 phi=3.4689, flav = [sbar ]
+constituents:
+  pt =    4.72172, orig. flav =  [sbar ], final flav =  [sbar ]
+  pt =    1.65618, orig. flav =      [g], final flav =      [g]
+
+base jet 9: pt=3.52758 rap=-0.619235 phi=2.98305, flav = [c ]
+IFN jet  9: pt=3.52758 rap=-0.619235 phi=2.98305, flav = [c ]
+constituents:
+  pt =    3.52758, orig. flav =     [c ], final flav =     [c ]
+
+base jet 10: pt=3.26785 rap=-1.98045 phi=1.33641, flav = [dbar ]
+IFN jet  10: pt=3.26785 rap=-1.98045 phi=1.33641, flav = [dbar ]
+constituents:
+  pt =    3.26785, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 11: pt=2.95687 rap=-0.46936 phi=3.53134, flav = [bbar ]
+IFN jet  11: pt=2.95687 rap=-0.46936 phi=3.53134, flav = [g]
+constituents:
+  pt =    2.95687, orig. flav =  [bbar ], final flav =      [g]
+
+base jet 12: pt=2.39443 rap=-1.04658 phi=1.77051, flav = [t ]
+IFN jet  12: pt=2.39443 rap=-1.04658 phi=1.77051, flav = [t ]
+constituents:
+  pt =    2.39443, orig. flav =     [t ], final flav =     [t ]
+
+base jet 13: pt=2.17275 rap=2.71029 phi=4.02432, flav = [s ]
+IFN jet  13: pt=2.17275 rap=2.71029 phi=4.02432, flav = [s ]
+constituents:
+  pt =    2.17275, orig. flav =     [s ], final flav =     [s ]
+
+base jet 14: pt=2.00771 rap=-2.66636 phi=1.9793, flav = [g]
+IFN jet  14: pt=2.00771 rap=-2.66636 phi=1.9793, flav = [g]
+constituents:
+  pt =    2.00771, orig. flav =      [g], final flav =      [g]
+
+base jet 15: pt=1.68935 rap=0.54944 phi=1.45194, flav = [g]
+IFN jet  15: pt=1.68935 rap=0.54944 phi=1.45194, flav = [g]
+constituents:
+  pt =    1.68935, orig. flav =      [g], final flav =      [g]
+
+base jet 16: pt=1.56645 rap=-2.45543 phi=0.857032, flav = [g]
+IFN jet  16: pt=1.56645 rap=-2.45543 phi=0.857032, flav = [g]
+constituents:
+  pt =    1.56645, orig. flav =      [g], final flav =      [g]
+
+base jet 17: pt=1.25273 rap=2.2372 phi=4.98823, flav = [d ]
+IFN jet  17: pt=1.25273 rap=2.2372 phi=4.98823, flav = [g]
+constituents:
+  pt =    1.25273, orig. flav =     [d ], final flav =      [g]
+
+base jet 18: pt=1.04324 rap=-0.0410581 phi=4.79549, flav = [g]
+IFN jet  18: pt=1.04324 rap=-0.0410581 phi=4.79549, flav = [g]
+constituents:
+  pt =    1.04324, orig. flav =      [g], final flav =      [g]
+
+base jet 19: pt=0.98457 rap=-0.90234 phi=1.03741, flav = [g]
+IFN jet  19: pt=0.98457 rap=-0.90234 phi=1.03741, flav = [g]
+constituents:
+  pt =    0.98457, orig. flav =      [g], final flav =      [g]
+
+base jet 20: pt=0.940359 rap=-7.05493 phi=4.47708, flav = [d u ]
+IFN jet  20: pt=0.940359 rap=-7.05493 phi=4.47708, flav = [d u ]
+constituents:
+  pt =   0.940359, orig. flav =   [d u ], final flav =   [d u ]
+
+base jet 21: pt=0.656026 rap=7.36601 phi=2.83859, flav = [d u ]
+IFN jet  21: pt=0.656026 rap=7.36601 phi=2.83859, flav = [d u ]
+constituents:
+  pt =   0.656026, orig. flav =   [d u ], final flav =   [d u ]
+
+base jet 22: pt=0.606412 rap=3.31014 phi=4.20996, flav = [s ]
+IFN jet  22: pt=0.606412 rap=3.31014 phi=4.20996, flav = [s ]
+constituents:
+  pt =   0.606412, orig. flav =     [s ], final flav =     [s ]
+
+base jet 23: pt=0.572105 rap=-3.68589 phi=0.864249, flav = [b ]
+IFN jet  23: pt=0.572105 rap=-3.68589 phi=0.864249, flav = [g]
+constituents:
+  pt =   0.572105, orig. flav =     [b ], final flav =      [g]
+
+base jet 24: pt=0.552919 rap=1.8734 phi=5.59751, flav = [g]
+IFN jet  24: pt=0.552919 rap=1.8734 phi=5.59751, flav = [g]
+constituents:
+  pt =   0.552919, orig. flav =      [g], final flav =      [g]
+
+base jet 25: pt=0.522022 rap=1.66103 phi=1.55341, flav = [g]
+IFN jet  25: pt=0.522022 rap=1.66103 phi=1.55341, flav = [g]
+constituents:
+  pt =   0.470604, orig. flav =      [g], final flav =      [g]
+  pt =   0.051762, orig. flav =      [g], final flav =      [g]
+
+base jet 26: pt=0.479117 rap=-4.48708 phi=5.41494, flav = [b ]
+IFN jet  26: pt=0.479117 rap=-4.48708 phi=5.41494, flav = [b ]
+constituents:
+  pt =   0.479117, orig. flav =     [b ], final flav =     [b ]
+
+base jet 27: pt=0.474687 rap=0.934876 phi=4.28687, flav = [t ]
+IFN jet  27: pt=0.474687 rap=0.934876 phi=4.28687, flav = [t ]
+constituents:
+  pt =   0.474687, orig. flav =     [t ], final flav =     [t ]
+
+base jet 28: pt=0.300278 rap=3.76919 phi=5.04174, flav = [b ]
+IFN jet  28: pt=0.300278 rap=3.76919 phi=5.04174, flav = [b ]
+constituents:
+  pt =   0.300278, orig. flav =     [b ], final flav =     [b ]
+
+base jet 29: pt=0.288055 rap=1.21298 phi=2.73595, flav = [s ]
+IFN jet  29: pt=0.288055 rap=1.21298 phi=2.73595, flav = [s ]
+constituents:
+  pt =   0.288055, orig. flav =     [s ], final flav =     [s ]
+
+base jet 30: pt=0.283717 rap=-2.51705 phi=2.86873, flav = [g]
+IFN jet  30: pt=0.283717 rap=-2.51705 phi=2.86873, flav = [g]
+constituents:
+  pt =   0.283717, orig. flav =      [g], final flav =      [g]
+
+base jet 31: pt=0.277488 rap=-1.26759 phi=0.396167, flav = [g]
+IFN jet  31: pt=0.277488 rap=-1.26759 phi=0.396167, flav = [g]
+constituents:
+  pt =   0.277488, orig. flav =      [g], final flav =      [g]
+
+base jet 32: pt=0.181345 rap=-3.192 phi=4.5503, flav = [g]
+IFN jet  32: pt=0.181345 rap=-3.192 phi=4.5503, flav = [g]
+constituents:
+  pt =   0.181345, orig. flav =      [g], final flav =      [g]
+
+base jet 33: pt=0.0214389 rap=-0.76379 phi=2.51577, flav = [g]
+IFN jet  33: pt=0.0214389 rap=-0.76379 phi=2.51577, flav = [g]
+constituents:
+  pt =  0.0214389, orig. flav =      [g], final flav =      [g]
+
+#---------------------------------------------------------------
+# read event 3 with 62 particles
+
+base jet 0: pt=113.596 rap=0.884767 phi=2.15347, flav = [u sbar cbar bbar ]
+IFN jet  0: pt=113.596 rap=0.884767 phi=2.15347, flav = [u sbar bbar ]
+constituents:
+  pt =    84.5779, orig. flav =     [u ], final flav =     [u ]
+  pt =    18.8333, orig. flav =  [sbar ], final flav =  [sbar ]
+  pt =    6.43962, orig. flav =      [g], final flav =      [g]
+  pt =    2.05959, orig. flav =  [cbar ], final flav =      [g]
+  pt =    1.07016, orig. flav =  [bbar ], final flav =  [bbar ]
+  pt =   0.670671, orig. flav =      [g], final flav =      [g]
+
+base jet 1: pt=3.10448 rap=3.11464 phi=3.8646, flav = [ubar sbar ]
+IFN jet  1: pt=3.10448 rap=3.11464 phi=3.8646, flav = [ubar sbar ]
+constituents:
+  pt =     1.0283, orig. flav =  [sbar ], final flav =  [sbar ]
+  pt =   0.825185, orig. flav =      [g], final flav =      [g]
+  pt =   0.661745, orig. flav =  [ubar ], final flav =  [ubar ]
+  pt =    0.62945, orig. flav =      [g], final flav =      [g]
+
+base jet 2: pt=3.0582 rap=0.648404 phi=3.39078, flav = [d s ]
+IFN jet  2: pt=3.0582 rap=0.648404 phi=3.39078, flav = [d s ]
+constituents:
+  pt =    1.88358, orig. flav =     [s ], final flav =     [s ]
+  pt =    1.17498, orig. flav =     [d ], final flav =     [d ]
+
+base jet 3: pt=2.69438 rap=0.14305 phi=2.06223, flav = [bbar ]
+IFN jet  3: pt=2.69438 rap=0.14305 phi=2.06223, flav = [bbar ]
+constituents:
+  pt =    1.86788, orig. flav =      [g], final flav =      [g]
+  pt =   0.854628, orig. flav =  [bbar ], final flav =  [bbar ]
+
+base jet 4: pt=2.65086 rap=-4.60299 phi=0.987066, flav = [d ]
+IFN jet  4: pt=2.65086 rap=-4.60299 phi=0.987066, flav = [d ]
+constituents:
+  pt =    1.92757, orig. flav =     [d ], final flav =     [d ]
+  pt =   0.726881, orig. flav =      [g], final flav =      [g]
+
+base jet 5: pt=2.08811 rap=-0.43226 phi=1.74763, flav = [s ]
+IFN jet  5: pt=2.08811 rap=-0.43226 phi=1.74763, flav = [s ]
+constituents:
+  pt =    2.08811, orig. flav =     [s ], final flav =     [s ]
+
+base jet 6: pt=1.77403 rap=3.12402 phi=3.18288, flav = [d ]
+IFN jet  6: pt=1.77403 rap=3.12402 phi=3.18288, flav = [d ]
+constituents:
+  pt =    1.77403, orig. flav =     [d ], final flav =     [d ]
+
+base jet 7: pt=1.66544 rap=-5.04812 phi=3.72053, flav = [d ]
+IFN jet  7: pt=1.66544 rap=-5.04812 phi=3.72053, flav = [d ]
+constituents:
+  pt =    1.66544, orig. flav =     [d ], final flav =     [d ]
+
+base jet 8: pt=1.63373 rap=-0.82687 phi=2.08532, flav = [sbar ]
+IFN jet  8: pt=1.63373 rap=-0.82687 phi=2.08532, flav = [sbar ]
+constituents:
+  pt =    1.63373, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 9: pt=1.5966 rap=-2.62067 phi=1.81629, flav = [ubar ]
+IFN jet  9: pt=1.5966 rap=-2.62067 phi=1.81629, flav = [ubar ]
+constituents:
+  pt =     1.5966, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 10: pt=1.53071 rap=2.11665 phi=5.80676, flav = [g]
+IFN jet  10: pt=1.53071 rap=2.11665 phi=5.80676, flav = [g]
+constituents:
+  pt =    1.53071, orig. flav =      [g], final flav =      [g]
+
+base jet 11: pt=1.38297 rap=2.92509 phi=4.83591, flav = [u ]
+IFN jet  11: pt=1.38297 rap=2.92509 phi=4.83591, flav = [u ]
+constituents:
+  pt =    1.38297, orig. flav =     [u ], final flav =     [u ]
+
+base jet 12: pt=1.17851 rap=-5.30359 phi=1.19263, flav = [g]
+IFN jet  12: pt=1.17851 rap=-5.30359 phi=1.19263, flav = [g]
+constituents:
+  pt =    1.17851, orig. flav =      [g], final flav =      [g]
+
+base jet 13: pt=1.16211 rap=-3.00612 phi=1.19331, flav = [u b ]
+IFN jet  13: pt=1.16211 rap=-3.00612 phi=1.19331, flav = [u ]
+constituents:
+  pt =   0.593377, orig. flav =     [u ], final flav =     [u ]
+  pt =   0.575222, orig. flav =     [b ], final flav =      [g]
+
+base jet 14: pt=1.14817 rap=6.6527 phi=2.39345, flav = [s ]
+IFN jet  14: pt=1.14817 rap=6.6527 phi=2.39345, flav = [s ]
+constituents:
+  pt =    1.14817, orig. flav =     [s ], final flav =     [s ]
+
+base jet 15: pt=1.12759 rap=2.0369 phi=4.74048, flav = [sbar b ]
+IFN jet  15: pt=1.12759 rap=2.0369 phi=4.74048, flav = [sbar ]
+constituents:
+  pt =   0.697385, orig. flav =  [sbar ], final flav =  [sbar ]
+  pt =   0.430464, orig. flav =     [b ], final flav =      [g]
+
+base jet 16: pt=1.09642 rap=-0.67831 phi=5.89701, flav = [c bbar ]
+IFN jet  16: pt=1.09642 rap=-0.67831 phi=5.89701, flav = [bbar ]
+constituents:
+  pt =   0.565059, orig. flav =     [c ], final flav =      [g]
+  pt =      0.538, orig. flav =  [bbar ], final flav =  [bbar ]
+
+base jet 17: pt=1.08025 rap=-1.19107 phi=5.63343, flav = [ubar ]
+IFN jet  17: pt=1.08025 rap=-1.19107 phi=5.63343, flav = [ubar ]
+constituents:
+  pt =    1.08025, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 18: pt=1.06428 rap=-0.289554 phi=0.999268, flav = [t ]
+IFN jet  18: pt=1.06428 rap=-0.289554 phi=0.999268, flav = [t ]
+constituents:
+  pt =    1.06428, orig. flav =     [t ], final flav =     [t ]
+
+base jet 19: pt=1.0457 rap=6.05529 phi=1.52444, flav = [d u ]
+IFN jet  19: pt=1.0457 rap=6.05529 phi=1.52444, flav = [d u ]
+constituents:
+  pt =     1.0457, orig. flav =   [d u ], final flav =   [d u ]
+
+base jet 20: pt=1.01488 rap=-1.44591 phi=4.03646, flav = [u ]
+IFN jet  20: pt=1.01488 rap=-1.44591 phi=4.03646, flav = [u ]
+constituents:
+  pt =    1.01488, orig. flav =     [u ], final flav =     [u ]
+
+base jet 21: pt=0.993602 rap=-0.0869548 phi=4.15804, flav = [d bbar ]
+IFN jet  21: pt=0.993602 rap=-0.0869548 phi=4.15804, flav = [d ]
+constituents:
+  pt =   0.620255, orig. flav =     [d ], final flav =     [d ]
+  pt =   0.386927, orig. flav =  [bbar ], final flav =      [g]
+
+base jet 22: pt=0.985143 rap=1.96485 phi=4.02595, flav = [g]
+IFN jet  22: pt=0.985143 rap=1.96485 phi=4.02595, flav = [g]
+constituents:
+  pt =   0.654448, orig. flav =      [g], final flav =      [g]
+  pt =   0.331912, orig. flav =      [g], final flav =      [g]
+
+base jet 23: pt=0.945258 rap=-0.810838 phi=3.6483, flav = [u ]
+IFN jet  23: pt=0.945258 rap=-0.810838 phi=3.6483, flav = [u ]
+constituents:
+  pt =   0.945258, orig. flav =     [u ], final flav =     [u ]
+
+base jet 24: pt=0.901582 rap=1.47923 phi=4.01952, flav = [g]
+IFN jet  24: pt=0.901582 rap=1.47923 phi=4.01952, flav = [g]
+constituents:
+  pt =   0.901582, orig. flav =      [g], final flav =      [g]
+
+base jet 25: pt=0.856581 rap=-3.49619 phi=1.14963, flav = [g]
+IFN jet  25: pt=0.856581 rap=-3.49619 phi=1.14963, flav = [g]
+constituents:
+  pt =   0.856581, orig. flav =      [g], final flav =      [g]
+
+base jet 26: pt=0.735732 rap=-1.52619 phi=1.92998, flav = [cbar ]
+IFN jet  26: pt=0.735732 rap=-1.52619 phi=1.92998, flav = [g]
+constituents:
+  pt =   0.735732, orig. flav =  [cbar ], final flav =      [g]
+
+base jet 27: pt=0.714956 rap=-1.07483 phi=1.08822, flav = [bbar ]
+IFN jet  27: pt=0.714956 rap=-1.07483 phi=1.08822, flav = [bbar ]
+constituents:
+  pt =   0.714956, orig. flav =  [bbar ], final flav =  [bbar ]
+
+base jet 28: pt=0.635763 rap=-2.31917 phi=0.438751, flav = [c ]
+IFN jet  28: pt=0.635763 rap=-2.31917 phi=0.438751, flav = [g]
+constituents:
+  pt =   0.635763, orig. flav =     [c ], final flav =      [g]
+
+base jet 29: pt=0.616757 rap=0.233943 phi=1.47353, flav = [sbar ]
+IFN jet  29: pt=0.616757 rap=0.233943 phi=1.47353, flav = [sbar ]
+constituents:
+  pt =   0.313318, orig. flav =  [sbar ], final flav =  [sbar ]
+  pt =   0.311052, orig. flav =      [g], final flav =      [g]
+
+base jet 30: pt=0.587412 rap=-4.58221 phi=3.70546, flav = [bbar ]
+IFN jet  30: pt=0.587412 rap=-4.58221 phi=3.70546, flav = [g]
+constituents:
+  pt =   0.587412, orig. flav =  [bbar ], final flav =      [g]
+
+base jet 31: pt=0.538598 rap=0.369704 phi=2.99212, flav = [g]
+IFN jet  31: pt=0.538598 rap=0.369704 phi=2.99212, flav = [g]
+constituents:
+  pt =   0.538598, orig. flav =      [g], final flav =      [g]
+
+base jet 32: pt=0.458607 rap=-0.371276 phi=2.87821, flav = [c ]
+IFN jet  32: pt=0.458607 rap=-0.371276 phi=2.87821, flav = [g]
+constituents:
+  pt =   0.458607, orig. flav =     [c ], final flav =      [g]
+
+base jet 33: pt=0.367634 rap=-1.92733 phi=2.4454, flav = [sbar ]
+IFN jet  33: pt=0.367634 rap=-1.92733 phi=2.4454, flav = [sbar ]
+constituents:
+  pt =   0.367634, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 34: pt=0.344187 rap=1.6731 phi=1.1241, flav = [g]
+IFN jet  34: pt=0.344187 rap=1.6731 phi=1.1241, flav = [g]
+constituents:
+  pt =   0.344187, orig. flav =      [g], final flav =      [g]
+
+base jet 35: pt=0.326826 rap=-4.0666 phi=1.26604, flav = [cbar ]
+IFN jet  35: pt=0.326826 rap=-4.0666 phi=1.26604, flav = [g]
+constituents:
+  pt =   0.326826, orig. flav =  [cbar ], final flav =      [g]
+
+base jet 36: pt=0.315411 rap=3.50524 phi=4.60533, flav = [ubar ]
+IFN jet  36: pt=0.315411 rap=3.50524 phi=4.60533, flav = [ubar ]
+constituents:
+  pt =   0.315411, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 37: pt=0.282369 rap=0.0609496 phi=3.55799, flav = [g]
+IFN jet  37: pt=0.282369 rap=0.0609496 phi=3.55799, flav = [g]
+constituents:
+  pt =   0.282369, orig. flav =      [g], final flav =      [g]
+
+base jet 38: pt=0.275342 rap=-1.41152 phi=4.65817, flav = [g]
+IFN jet  38: pt=0.275342 rap=-1.41152 phi=4.65817, flav = [g]
+constituents:
+  pt =   0.275342, orig. flav =      [g], final flav =      [g]
+
+base jet 39: pt=0.270557 rap=-6.42821 phi=1.9268, flav = [d u ]
+IFN jet  39: pt=0.270557 rap=-6.42821 phi=1.9268, flav = [d u ]
+constituents:
+  pt =   0.270557, orig. flav =   [d u ], final flav =   [d u ]
+
+base jet 40: pt=0.236389 rap=-1.39315 phi=1.53166, flav = [g]
+IFN jet  40: pt=0.236389 rap=-1.39315 phi=1.53166, flav = [g]
+constituents:
+  pt =   0.236389, orig. flav =      [g], final flav =      [g]
+
+base jet 41: pt=0.180563 rap=-2.61987 phi=3.47406, flav = [s ]
+IFN jet  41: pt=0.180563 rap=-2.61987 phi=3.47406, flav = [s ]
+constituents:
+  pt =   0.180563, orig. flav =     [s ], final flav =     [s ]
+
+base jet 42: pt=0.116413 rap=-3.54693 phi=5.82437, flav = [g]
+IFN jet  42: pt=0.116413 rap=-3.54693 phi=5.82437, flav = [g]
+constituents:
+  pt =   0.116413, orig. flav =      [g], final flav =      [g]
+
+base jet 43: pt=0.0409862 rap=0.0572104 phi=6.27533, flav = [g]
+IFN jet  43: pt=0.0409862 rap=0.0572104 phi=6.27533, flav = [g]
+constituents:
+  pt =  0.0409862, orig. flav =      [g], final flav =      [g]
+
+base jet 44: pt=0.000367874 rap=-1.87847 phi=4.91532, flav = [g]
+IFN jet  44: pt=0.000367874 rap=-1.87847 phi=4.91532, flav = [g]
+constituents:
+  pt = 0.000367874, orig. flav =      [g], final flav =      [g]
+
+#---------------------------------------------------------------
+# read event 4 with 93 particles
+
+base jet 0: pt=64.6815 rap=0.391394 phi=0.118011, flav = [u c tbar ]
+IFN jet  0: pt=64.6815 rap=0.391394 phi=0.118011, flav = [u c ]
+constituents:
+  pt =    41.6981, orig. flav =     [u ], final flav =     [u ]
+  pt =    5.50916, orig. flav =  [ubar ], final flav =      [g]
+  pt =    3.68609, orig. flav =     [u ], final flav =      [g]
+  pt =    3.67113, orig. flav =     [s ], final flav =      [g]
+  pt =    2.92951, orig. flav =      [g], final flav =      [g]
+  pt =    2.68583, orig. flav =  [sbar ], final flav =      [g]
+  pt =    1.77594, orig. flav =      [g], final flav =      [g]
+  pt =    1.29025, orig. flav =  [tbar ], final flav =      [g]
+  pt =    1.09112, orig. flav =     [c ], final flav =     [c ]
+  pt =   0.549747, orig. flav =      [g], final flav =      [g]
+
+base jet 1: pt=60.6132 rap=0.448714 phi=0.539508, flav = [d ubar bbar tbar ]
+IFN jet  1: pt=60.6132 rap=0.448714 phi=0.539508, flav = [d ubar bbar tbar ]
+constituents:
+  pt =     20.604, orig. flav =     [d ], final flav =     [d ]
+  pt =    16.7998, orig. flav =  [ubar ], final flav =  [ubar ]
+  pt =    5.36742, orig. flav =      [g], final flav =      [g]
+  pt =    4.42483, orig. flav =  [bbar ], final flav =  [bbar ]
+  pt =    4.22446, orig. flav =      [g], final flav =      [g]
+  pt =    4.19527, orig. flav =  [sbar ], final flav =      [g]
+  pt =    2.38599, orig. flav =  [tbar ], final flav =  [tbar ]
+  pt =    1.60754, orig. flav =     [s ], final flav =      [g]
+  pt =    1.20698, orig. flav =      [g], final flav =      [g]
+
+base jet 2: pt=8.27633 rap=-2.79808 phi=4.26636, flav = [g]
+IFN jet  2: pt=8.27633 rap=-2.79808 phi=4.26636, flav = [g]
+constituents:
+  pt =    6.00207, orig. flav =     [u ], final flav =     [u ]
+  pt =    2.24363, orig. flav =  [ubar ], final flav =  [ubar ]
+  pt =   0.135296, orig. flav =      [g], final flav =      [g]
+
+base jet 3: pt=7.33896 rap=1.12216 phi=5.90749, flav = [g]
+IFN jet  3: pt=7.33896 rap=1.12216 phi=5.90749, flav = [g]
+constituents:
+  pt =    4.75356, orig. flav =      [g], final flav =      [g]
+  pt =    2.60351, orig. flav =      [g], final flav =      [g]
+
+base jet 4: pt=5.6391 rap=-2.22665 phi=3.29502, flav = [dbar dbar t ]
+IFN jet  4: pt=5.6391 rap=-2.22665 phi=3.29502, flav = [dbar dbar t ]
+constituents:
+  pt =    3.10986, orig. flav =  [dbar ], final flav =  [dbar ]
+  pt =    2.12228, orig. flav =     [t ], final flav =     [t ]
+  pt =   0.486026, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 5: pt=3.09749 rap=0.126394 phi=1.32143, flav = [d c ]
+IFN jet  5: pt=3.09749 rap=0.126394 phi=1.32143, flav = [d ]
+constituents:
+  pt =    1.83144, orig. flav =     [c ], final flav =      [g]
+  pt =   0.856199, orig. flav =      [g], final flav =      [g]
+  pt =   0.420541, orig. flav =     [d ], final flav =     [d ]
+
+base jet 6: pt=3.07467 rap=-0.446667 phi=1.16557, flav = [d cbar ]
+IFN jet  6: pt=3.07467 rap=-0.446667 phi=1.16557, flav = [d ]
+constituents:
+  pt =    1.78678, orig. flav =  [cbar ], final flav =      [g]
+  pt =   0.659543, orig. flav =     [d ], final flav =     [d ]
+  pt =   0.630736, orig. flav =      [g], final flav =      [g]
+
+base jet 7: pt=2.99946 rap=1.23103 phi=3.12769, flav = [g]
+IFN jet  7: pt=2.99946 rap=1.23103 phi=3.12769, flav = [g]
+constituents:
+  pt =    2.26413, orig. flav =      [g], final flav =      [g]
+  pt =   0.736181, orig. flav =      [g], final flav =      [g]
+
+base jet 8: pt=2.72094 rap=1.77131 phi=1.80173, flav = [ubar sbar ]
+IFN jet  8: pt=2.72094 rap=1.77131 phi=1.80173, flav = [ubar sbar ]
+constituents:
+  pt =    1.96345, orig. flav =  [sbar ], final flav =  [sbar ]
+  pt =   0.782091, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 9: pt=2.2549 rap=-2.18162 phi=0.109749, flav = [g]
+IFN jet  9: pt=2.2549 rap=-2.18162 phi=0.109749, flav = [g]
+constituents:
+  pt =     2.2549, orig. flav =      [g], final flav =      [g]
+
+base jet 10: pt=2.1835 rap=0.0633507 phi=1.75445, flav = [t ]
+IFN jet  10: pt=2.1835 rap=0.0633507 phi=1.75445, flav = [g]
+constituents:
+  pt =     2.1835, orig. flav =     [t ], final flav =      [g]
+
+base jet 11: pt=1.91865 rap=2.82374 phi=6.20892, flav = [t ]
+IFN jet  11: pt=1.91865 rap=2.82374 phi=6.20892, flav = [g]
+constituents:
+  pt =    1.91865, orig. flav =     [t ], final flav =      [g]
+
+base jet 12: pt=1.77941 rap=-1.85137 phi=1.34849, flav = [g]
+IFN jet  12: pt=1.77941 rap=-1.85137 phi=1.34849, flav = [g]
+constituents:
+  pt =    1.21968, orig. flav =      [g], final flav =      [g]
+  pt =   0.567604, orig. flav =      [g], final flav =      [g]
+
+base jet 13: pt=1.49371 rap=5.45794 phi=4.04488, flav = [u ]
+IFN jet  13: pt=1.49371 rap=5.45794 phi=4.04488, flav = [u ]
+constituents:
+  pt =    1.49371, orig. flav =     [u ], final flav =     [u ]
+
+base jet 14: pt=1.40893 rap=-1.07484 phi=6.27594, flav = [u sbar ]
+IFN jet  14: pt=1.40893 rap=-1.07484 phi=6.27594, flav = [u sbar ]
+constituents:
+  pt =   0.849208, orig. flav =      [g], final flav =      [g]
+  pt =   0.305598, orig. flav =  [sbar ], final flav =  [sbar ]
+  pt =   0.261449, orig. flav =     [u ], final flav =     [u ]
+
+base jet 15: pt=1.29223 rap=-0.416627 phi=2.9184, flav = [d ]
+IFN jet  15: pt=1.29223 rap=-0.416627 phi=2.9184, flav = [d ]
+constituents:
+  pt =    1.28053, orig. flav =     [d ], final flav =     [d ]
+  pt =  0.0117738, orig. flav =      [g], final flav =      [g]
+
+base jet 16: pt=1.22843 rap=-2.45955 phi=5.48621, flav = [u ]
+IFN jet  16: pt=1.22843 rap=-2.45955 phi=5.48621, flav = [u ]
+constituents:
+  pt =    1.22843, orig. flav =     [u ], final flav =     [u ]
+
+base jet 17: pt=1.19431 rap=-5.62653 phi=2.95634, flav = [u ]
+IFN jet  17: pt=1.19431 rap=-5.62653 phi=2.95634, flav = [u ]
+constituents:
+  pt =    1.19431, orig. flav =     [u ], final flav =     [u ]
+
+base jet 18: pt=1.09939 rap=-6.62034 phi=2.55075, flav = [d u ]
+IFN jet  18: pt=1.09939 rap=-6.62034 phi=2.55075, flav = [d u ]
+constituents:
+  pt =    1.09939, orig. flav =   [d u ], final flav =   [d u ]
+
+base jet 19: pt=1.05201 rap=1.50084 phi=5.70623, flav = [g]
+IFN jet  19: pt=1.05201 rap=1.50084 phi=5.70623, flav = [g]
+constituents:
+  pt =    1.05201, orig. flav =      [g], final flav =      [g]
+
+base jet 20: pt=0.943416 rap=-0.267713 phi=0.607747, flav = [sbar b ]
+IFN jet  20: pt=0.943416 rap=-0.267713 phi=0.607747, flav = [g]
+constituents:
+  pt =   0.672854, orig. flav =     [b ], final flav =      [g]
+  pt =   0.270679, orig. flav =  [sbar ], final flav =      [g]
+
+base jet 21: pt=0.921789 rap=-2.5209 phi=4.8201, flav = [g]
+IFN jet  21: pt=0.921789 rap=-2.5209 phi=4.8201, flav = [g]
+constituents:
+  pt =   0.921789, orig. flav =      [g], final flav =      [g]
+
+base jet 22: pt=0.875809 rap=0.61858 phi=2.22812, flav = [g]
+IFN jet  22: pt=0.875809 rap=0.61858 phi=2.22812, flav = [g]
+constituents:
+  pt =   0.875809, orig. flav =      [g], final flav =      [g]
+
+base jet 23: pt=0.844818 rap=1.08393 phi=0.835088, flav = [g]
+IFN jet  23: pt=0.844818 rap=1.08393 phi=0.835088, flav = [g]
+constituents:
+  pt =   0.844818, orig. flav =      [g], final flav =      [g]
+
+base jet 24: pt=0.833654 rap=2.58714 phi=5.13165, flav = [g]
+IFN jet  24: pt=0.833654 rap=2.58714 phi=5.13165, flav = [g]
+constituents:
+  pt =   0.440816, orig. flav =      [g], final flav =      [g]
+  pt =   0.394859, orig. flav =      [g], final flav =      [g]
+
+base jet 25: pt=0.795921 rap=5.79971 phi=1.50809, flav = [u ]
+IFN jet  25: pt=0.795921 rap=5.79971 phi=1.50809, flav = [u ]
+constituents:
+  pt =   0.795921, orig. flav =     [u ], final flav =     [u ]
+
+base jet 26: pt=0.771756 rap=3.82285 phi=1.35606, flav = [d ]
+IFN jet  26: pt=0.771756 rap=3.82285 phi=1.35606, flav = [d ]
+constituents:
+  pt =   0.771756, orig. flav =     [d ], final flav =     [d ]
+
+base jet 27: pt=0.713651 rap=-3.72448 phi=4.96354, flav = [ubar ]
+IFN jet  27: pt=0.713651 rap=-3.72448 phi=4.96354, flav = [ubar ]
+constituents:
+  pt =   0.713651, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 28: pt=0.707698 rap=1.99622 phi=5.55461, flav = [bbar ]
+IFN jet  28: pt=0.707698 rap=1.99622 phi=5.55461, flav = [g]
+constituents:
+  pt =   0.707698, orig. flav =  [bbar ], final flav =      [g]
+
+base jet 29: pt=0.639731 rap=0.991284 phi=5.19785, flav = [g]
+IFN jet  29: pt=0.639731 rap=0.991284 phi=5.19785, flav = [g]
+constituents:
+  pt =   0.639731, orig. flav =      [g], final flav =      [g]
+
+base jet 30: pt=0.639004 rap=6.11083 phi=3.66267, flav = [g]
+IFN jet  30: pt=0.639004 rap=6.11083 phi=3.66267, flav = [g]
+constituents:
+  pt =   0.639004, orig. flav =      [g], final flav =      [g]
+
+base jet 31: pt=0.633122 rap=4.27978 phi=4.04482, flav = [g]
+IFN jet  31: pt=0.633122 rap=4.27978 phi=4.04482, flav = [g]
+constituents:
+  pt =   0.633122, orig. flav =      [g], final flav =      [g]
+
+base jet 32: pt=0.605937 rap=5.37129 phi=3.26461, flav = [t ]
+IFN jet  32: pt=0.605937 rap=5.37129 phi=3.26461, flav = [t ]
+constituents:
+  pt =   0.605937, orig. flav =     [t ], final flav =     [t ]
+
+base jet 33: pt=0.590525 rap=1.2242 phi=4.8405, flav = [c ]
+IFN jet  33: pt=0.590525 rap=1.2242 phi=4.8405, flav = [c ]
+constituents:
+  pt =   0.590525, orig. flav =     [c ], final flav =     [c ]
+
+base jet 34: pt=0.581598 rap=4.38855 phi=1.48003, flav = [dbar u ]
+IFN jet  34: pt=0.581598 rap=4.38855 phi=1.48003, flav = [dbar u ]
+constituents:
+  pt =   0.307412, orig. flav =     [u ], final flav =     [u ]
+  pt =   0.276227, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 35: pt=0.546297 rap=0.937221 phi=0.35331, flav = [g]
+IFN jet  35: pt=0.546297 rap=0.937221 phi=0.35331, flav = [g]
+constituents:
+  pt =   0.546297, orig. flav =      [g], final flav =      [g]
+
+base jet 36: pt=0.543966 rap=-2.97743 phi=5.54568, flav = [ubar ]
+IFN jet  36: pt=0.543966 rap=-2.97743 phi=5.54568, flav = [ubar ]
+constituents:
+  pt =   0.543966, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 37: pt=0.521387 rap=-1.65433 phi=0.707898, flav = [g]
+IFN jet  37: pt=0.521387 rap=-1.65433 phi=0.707898, flav = [g]
+constituents:
+  pt =   0.521387, orig. flav =      [g], final flav =      [g]
+
+base jet 38: pt=0.480634 rap=5.95519 phi=2.61508, flav = [d ]
+IFN jet  38: pt=0.480634 rap=5.95519 phi=2.61508, flav = [d ]
+constituents:
+  pt =   0.480634, orig. flav =     [d ], final flav =     [d ]
+
+base jet 39: pt=0.465609 rap=2.14305 phi=3.10075, flav = [bbar ]
+IFN jet  39: pt=0.465609 rap=2.14305 phi=3.10075, flav = [bbar ]
+constituents:
+  pt =   0.465609, orig. flav =  [bbar ], final flav =  [bbar ]
+
+base jet 40: pt=0.442244 rap=3.11583 phi=5.25811, flav = [ubar ]
+IFN jet  40: pt=0.442244 rap=3.11583 phi=5.25811, flav = [ubar ]
+constituents:
+  pt =   0.442244, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 41: pt=0.43722 rap=0.150514 phi=2.75431, flav = [g]
+IFN jet  41: pt=0.43722 rap=0.150514 phi=2.75431, flav = [g]
+constituents:
+  pt =    0.43722, orig. flav =      [g], final flav =      [g]
+
+base jet 42: pt=0.42787 rap=0.436933 phi=1.57366, flav = [s ]
+IFN jet  42: pt=0.42787 rap=0.436933 phi=1.57366, flav = [g]
+constituents:
+  pt =    0.42787, orig. flav =     [s ], final flav =      [g]
+
+base jet 43: pt=0.411842 rap=-1.26415 phi=2.08269, flav = [g]
+IFN jet  43: pt=0.411842 rap=-1.26415 phi=2.08269, flav = [g]
+constituents:
+  pt =   0.411842, orig. flav =      [g], final flav =      [g]
+
+base jet 44: pt=0.400929 rap=3.63984 phi=2.14692, flav = [g]
+IFN jet  44: pt=0.400929 rap=3.63984 phi=2.14692, flav = [g]
+constituents:
+  pt =   0.400929, orig. flav =      [g], final flav =      [g]
+
+base jet 45: pt=0.339731 rap=-1.62643 phi=4.26943, flav = [g]
+IFN jet  45: pt=0.339731 rap=-1.62643 phi=4.26943, flav = [g]
+constituents:
+  pt =   0.339731, orig. flav =      [g], final flav =      [g]
+
+base jet 46: pt=0.323149 rap=3.35167 phi=3.43394, flav = [g]
+IFN jet  46: pt=0.323149 rap=3.35167 phi=3.43394, flav = [g]
+constituents:
+  pt =   0.323149, orig. flav =      [g], final flav =      [g]
+
+base jet 47: pt=0.311072 rap=2.12474 phi=2.13269, flav = [g]
+IFN jet  47: pt=0.311072 rap=2.12474 phi=2.13269, flav = [g]
+constituents:
+  pt =   0.311072, orig. flav =      [g], final flav =      [g]
+
+base jet 48: pt=0.309475 rap=-1.22922 phi=5.53698, flav = [s ]
+IFN jet  48: pt=0.309475 rap=-1.22922 phi=5.53698, flav = [s ]
+constituents:
+  pt =   0.309475, orig. flav =     [s ], final flav =     [s ]
+
+base jet 49: pt=0.298757 rap=5.19963 phi=4.52078, flav = [u ]
+IFN jet  49: pt=0.298757 rap=5.19963 phi=4.52078, flav = [u ]
+constituents:
+  pt =   0.298757, orig. flav =     [u ], final flav =     [u ]
+
+base jet 50: pt=0.278128 rap=3.94799 phi=3.03891, flav = [g]
+IFN jet  50: pt=0.278128 rap=3.94799 phi=3.03891, flav = [g]
+constituents:
+  pt =   0.278128, orig. flav =      [g], final flav =      [g]
+
+base jet 51: pt=0.265764 rap=-0.885221 phi=2.64341, flav = [tbar ]
+IFN jet  51: pt=0.265764 rap=-0.885221 phi=2.64341, flav = [g]
+constituents:
+  pt =   0.265764, orig. flav =  [tbar ], final flav =      [g]
+
+base jet 52: pt=0.241476 rap=-0.612924 phi=5.34811, flav = [g]
+IFN jet  52: pt=0.241476 rap=-0.612924 phi=5.34811, flav = [g]
+constituents:
+  pt =   0.241476, orig. flav =      [g], final flav =      [g]
+
+base jet 53: pt=0.217796 rap=3.41688 phi=0.451923, flav = [sbar ]
+IFN jet  53: pt=0.217796 rap=3.41688 phi=0.451923, flav = [sbar ]
+constituents:
+  pt =   0.217796, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 54: pt=0.162116 rap=-0.173813 phi=5.41056, flav = [g]
+IFN jet  54: pt=0.162116 rap=-0.173813 phi=5.41056, flav = [g]
+constituents:
+  pt =   0.162116, orig. flav =      [g], final flav =      [g]
+
+base jet 55: pt=0.112512 rap=-0.0545497 phi=2.39963, flav = [g]
+IFN jet  55: pt=0.112512 rap=-0.0545497 phi=2.39963, flav = [g]
+constituents:
+  pt =   0.112512, orig. flav =      [g], final flav =      [g]
+
+base jet 56: pt=0.0428028 rap=-1.882 phi=2.17436, flav = [g]
+IFN jet  56: pt=0.0428028 rap=-1.882 phi=2.17436, flav = [g]
+constituents:
+  pt =  0.0428028, orig. flav =      [g], final flav =      [g]
+
+base jet 57: pt=0.0182354 rap=1.83065 phi=4.04384, flav = [sbar ]
+IFN jet  57: pt=0.0182354 rap=1.83065 phi=4.04384, flav = [sbar ]
+constituents:
+  pt =  0.0182354, orig. flav =  [sbar ], final flav =  [sbar ]
+
+#---------------------------------------------------------------
+# read event 5 with 104 particles
+
+base jet 0: pt=103.576 rap=0.670846 phi=5.56992, flav = [ubar c c t ]
+IFN jet  0: pt=103.576 rap=0.670846 phi=5.56992, flav = [dbar c t ]
+constituents:
+  pt =    23.9763, orig. flav =      [g], final flav =      [g]
+  pt =    22.4901, orig. flav =      [g], final flav =      [g]
+  pt =    14.9044, orig. flav =  [dbar ], final flav =  [dbar ]
+  pt =    7.06066, orig. flav =      [g], final flav =      [g]
+  pt =    6.14926, orig. flav =  [bbar ], final flav =      [g]
+  pt =    5.69092, orig. flav =      [g], final flav =      [g]
+  pt =    4.89757, orig. flav =      [g], final flav =      [g]
+  pt =    3.99553, orig. flav =     [c ], final flav =     [c ]
+  pt =    2.26013, orig. flav =     [d ], final flav =      [g]
+  pt =    1.89047, orig. flav =  [ubar ], final flav =      [g]
+  pt =    1.86911, orig. flav =     [t ], final flav =     [t ]
+  pt =    1.81841, orig. flav =     [c ], final flav =      [g]
+  pt =    1.71179, orig. flav =     [b ], final flav =      [g]
+  pt =    1.69529, orig. flav =      [g], final flav =      [g]
+  pt =    1.31468, orig. flav =     [s ], final flav =      [g]
+  pt =    1.25161, orig. flav =  [sbar ], final flav =      [g]
+  pt =   0.604694, orig. flav =     [b ], final flav =      [g]
+  pt =   0.492421, orig. flav =  [bbar ], final flav =      [g]
+
+base jet 1: pt=4.58178 rap=-1.90869 phi=2.36617, flav = [dbar ]
+IFN jet  1: pt=4.58178 rap=-1.90869 phi=2.36617, flav = [dbar ]
+constituents:
+  pt =    3.24287, orig. flav =  [dbar ], final flav =  [dbar ]
+  pt =    1.00752, orig. flav =      [g], final flav =      [g]
+  pt =   0.377775, orig. flav =      [g], final flav =      [g]
+
+base jet 2: pt=3.3254 rap=1.18649 phi=5.73498, flav = [d c ]
+IFN jet  2: pt=3.3254 rap=1.18649 phi=5.73498, flav = [d c ]
+constituents:
+  pt =    2.54573, orig. flav =     [d ], final flav =     [d ]
+  pt =   0.810232, orig. flav =     [c ], final flav =     [c ]
+
+base jet 3: pt=3.17718 rap=2.72848 phi=5.65978, flav = [d ]
+IFN jet  3: pt=3.17718 rap=2.72848 phi=5.65978, flav = [d ]
+constituents:
+  pt =    3.17718, orig. flav =     [d ], final flav =     [d ]
+
+base jet 4: pt=3.07538 rap=-2.94002 phi=5.57259, flav = [cbar ]
+IFN jet  4: pt=3.07538 rap=-2.94002 phi=5.57259, flav = [cbar ]
+constituents:
+  pt =    3.07538, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 5: pt=2.91546 rap=4.90048 phi=0.0643643, flav = [dbar b ]
+IFN jet  5: pt=2.91546 rap=4.90048 phi=0.0643643, flav = [dbar b ]
+constituents:
+  pt =    2.28586, orig. flav =     [b ], final flav =     [b ]
+  pt =   0.639866, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 6: pt=2.79087 rap=-0.0839135 phi=3.72992, flav = [g]
+IFN jet  6: pt=2.79087 rap=-0.0839135 phi=3.72992, flav = [g]
+constituents:
+  pt =    2.14707, orig. flav =      [g], final flav =      [g]
+  pt =   0.645637, orig. flav =      [g], final flav =      [g]
+
+base jet 7: pt=2.66046 rap=-1.36723 phi=2.09926, flav = [ubar ]
+IFN jet  7: pt=2.66046 rap=-1.36723 phi=2.09926, flav = [g]
+constituents:
+  pt =    1.74647, orig. flav =  [ubar ], final flav =      [g]
+  pt =   0.920829, orig. flav =      [g], final flav =      [g]
+
+base jet 8: pt=2.56647 rap=3.36059 phi=5.47546, flav = [b ]
+IFN jet  8: pt=2.56647 rap=3.36059 phi=5.47546, flav = [b ]
+constituents:
+  pt =    2.56647, orig. flav =     [b ], final flav =     [b ]
+
+base jet 9: pt=2.19566 rap=0.816755 phi=4.80042, flav = [cbar ]
+IFN jet  9: pt=2.19566 rap=0.816755 phi=4.80042, flav = [g]
+constituents:
+  pt =    2.19566, orig. flav =  [cbar ], final flav =      [g]
+
+base jet 10: pt=1.90258 rap=-0.368807 phi=4.16633, flav = [b ]
+IFN jet  10: pt=1.90258 rap=-0.368807 phi=4.16633, flav = [b ]
+constituents:
+  pt =    1.90258, orig. flav =     [b ], final flav =     [b ]
+
+base jet 11: pt=1.77874 rap=1.71841 phi=2.12888, flav = [g]
+IFN jet  11: pt=1.77874 rap=1.71841 phi=2.12888, flav = [g]
+constituents:
+  pt =    1.13429, orig. flav =      [g], final flav =      [g]
+  pt =   0.652451, orig. flav =      [g], final flav =      [g]
+
+base jet 12: pt=1.75906 rap=-0.441818 phi=0.900447, flav = [u tbar ]
+IFN jet  12: pt=1.75906 rap=-0.441818 phi=0.900447, flav = [g]
+constituents:
+  pt =     1.1012, orig. flav =      [g], final flav =      [g]
+  pt =   0.317973, orig. flav =      [g], final flav =      [g]
+  pt =   0.215601, orig. flav =     [u ], final flav =      [g]
+  pt =   0.137049, orig. flav =  [tbar ], final flav =      [g]
+
+base jet 13: pt=1.66894 rap=-0.0808496 phi=2.67093, flav = [ubar ]
+IFN jet  13: pt=1.66894 rap=-0.0808496 phi=2.67093, flav = [g]
+constituents:
+  pt =    1.24928, orig. flav =  [ubar ], final flav =      [g]
+  pt =   0.427242, orig. flav =      [g], final flav =      [g]
+
+base jet 14: pt=1.65914 rap=-1.10639 phi=1.73822, flav = [u ]
+IFN jet  14: pt=1.65914 rap=-1.10639 phi=1.73822, flav = [g]
+constituents:
+  pt =    1.65914, orig. flav =     [u ], final flav =      [g]
+
+base jet 15: pt=1.57407 rap=0.375704 phi=0.286954, flav = [b ]
+IFN jet  15: pt=1.57407 rap=0.375704 phi=0.286954, flav = [b ]
+constituents:
+  pt =    1.57407, orig. flav =     [b ], final flav =     [b ]
+
+base jet 16: pt=1.56625 rap=-0.638066 phi=2.98326, flav = [g]
+IFN jet  16: pt=1.56625 rap=-0.638066 phi=2.98326, flav = [g]
+constituents:
+  pt =    1.09436, orig. flav =      [g], final flav =      [g]
+  pt =   0.479972, orig. flav =      [g], final flav =      [g]
+
+base jet 17: pt=1.53099 rap=0.666093 phi=2.54593, flav = [s ]
+IFN jet  17: pt=1.53099 rap=0.666093 phi=2.54593, flav = [s ]
+constituents:
+  pt =    1.27797, orig. flav =     [s ], final flav =     [s ]
+  pt =   0.264861, orig. flav =      [g], final flav =      [g]
+
+base jet 18: pt=1.52508 rap=-1.62383 phi=1.52316, flav = [g]
+IFN jet  18: pt=1.52508 rap=-1.62383 phi=1.52316, flav = [g]
+constituents:
+  pt =    1.52508, orig. flav =      [g], final flav =      [g]
+
+base jet 19: pt=1.48377 rap=4.79271 phi=2.36556, flav = [g]
+IFN jet  19: pt=1.48377 rap=4.79271 phi=2.36556, flav = [g]
+constituents:
+  pt =    1.48377, orig. flav =      [g], final flav =      [g]
+
+base jet 20: pt=1.48009 rap=0.430208 phi=5.19574, flav = [g]
+IFN jet  20: pt=1.48009 rap=0.430208 phi=5.19574, flav = [g]
+constituents:
+  pt =    1.48009, orig. flav =      [g], final flav =      [g]
+
+base jet 21: pt=1.38769 rap=3.19928 phi=0.885113, flav = [g]
+IFN jet  21: pt=1.38769 rap=3.19928 phi=0.885113, flav = [g]
+constituents:
+  pt =   0.890343, orig. flav =     [s ], final flav =     [s ]
+  pt =   0.427447, orig. flav =      [g], final flav =      [g]
+  pt =  0.0784818, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 22: pt=1.37067 rap=4.3294 phi=4.95068, flav = [ubar ]
+IFN jet  22: pt=1.37067 rap=4.3294 phi=4.95068, flav = [ubar ]
+constituents:
+  pt =    1.37067, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 23: pt=1.33857 rap=2.90865 phi=6.11471, flav = [g]
+IFN jet  23: pt=1.33857 rap=2.90865 phi=6.11471, flav = [g]
+constituents:
+  pt =    1.33857, orig. flav =      [g], final flav =      [g]
+
+base jet 24: pt=1.3384 rap=-0.684202 phi=2.09932, flav = [ubar t ]
+IFN jet  24: pt=1.3384 rap=-0.684202 phi=2.09932, flav = [t ]
+constituents:
+  pt =   0.900871, orig. flav =     [t ], final flav =     [t ]
+  pt =   0.446251, orig. flav =  [ubar ], final flav =      [g]
+
+base jet 25: pt=1.25816 rap=2.68646 phi=4.78388, flav = [sbar b ]
+IFN jet  25: pt=1.25816 rap=2.68646 phi=4.78388, flav = [sbar b ]
+constituents:
+  pt =   0.674191, orig. flav =     [b ], final flav =     [b ]
+  pt =   0.600112, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 26: pt=1.20045 rap=3.36562 phi=2.312, flav = [u ]
+IFN jet  26: pt=1.20045 rap=3.36562 phi=2.312, flav = [u ]
+constituents:
+  pt =    1.20045, orig. flav =     [u ], final flav =     [u ]
+
+base jet 27: pt=1.1616 rap=2.31063 phi=0.674491, flav = [g]
+IFN jet  27: pt=1.1616 rap=2.31063 phi=0.674491, flav = [g]
+constituents:
+  pt =     1.1616, orig. flav =      [g], final flav =      [g]
+
+base jet 28: pt=1.16047 rap=-1.91441 phi=3.09778, flav = [u t ]
+IFN jet  28: pt=1.16047 rap=-1.91441 phi=3.09778, flav = [u t ]
+constituents:
+  pt =   0.771884, orig. flav =     [t ], final flav =     [t ]
+  pt =   0.388772, orig. flav =     [u ], final flav =     [u ]
+
+base jet 29: pt=1.13847 rap=0.117427 phi=4.26462, flav = [g]
+IFN jet  29: pt=1.13847 rap=0.117427 phi=4.26462, flav = [g]
+constituents:
+  pt =    1.13847, orig. flav =      [g], final flav =      [g]
+
+base jet 30: pt=1.13016 rap=1.72204 phi=4.21821, flav = [g]
+IFN jet  30: pt=1.13016 rap=1.72204 phi=4.21821, flav = [g]
+constituents:
+  pt =    1.13016, orig. flav =      [g], final flav =      [g]
+
+base jet 31: pt=1.12958 rap=1.40598 phi=0.188041, flav = [dbar ]
+IFN jet  31: pt=1.12958 rap=1.40598 phi=0.188041, flav = [g]
+constituents:
+  pt =    1.12958, orig. flav =  [dbar ], final flav =      [g]
+
+base jet 32: pt=0.953686 rap=5.34921 phi=0.943114, flav = [d ]
+IFN jet  32: pt=0.953686 rap=5.34921 phi=0.943114, flav = [d ]
+constituents:
+  pt =   0.953686, orig. flav =     [d ], final flav =     [d ]
+
+base jet 33: pt=0.926798 rap=2.70564 phi=1.28736, flav = [ubar ]
+IFN jet  33: pt=0.926798 rap=2.70564 phi=1.28736, flav = [ubar ]
+constituents:
+  pt =   0.926798, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 34: pt=0.915089 rap=-0.973834 phi=3.47696, flav = [u ]
+IFN jet  34: pt=0.915089 rap=-0.973834 phi=3.47696, flav = [g]
+constituents:
+  pt =   0.769102, orig. flav =     [u ], final flav =      [g]
+  pt =   0.152873, orig. flav =      [g], final flav =      [g]
+
+base jet 35: pt=0.863148 rap=3.05011 phi=0.304023, flav = [t ]
+IFN jet  35: pt=0.863148 rap=3.05011 phi=0.304023, flav = [t ]
+constituents:
+  pt =   0.863148, orig. flav =     [t ], final flav =     [t ]
+
+base jet 36: pt=0.849618 rap=-3.29141 phi=3.95914, flav = [d ]
+IFN jet  36: pt=0.849618 rap=-3.29141 phi=3.95914, flav = [d ]
+constituents:
+  pt =   0.849618, orig. flav =     [d ], final flav =     [d ]
+
+base jet 37: pt=0.845184 rap=-0.197754 phi=1.6774, flav = [g]
+IFN jet  37: pt=0.845184 rap=-0.197754 phi=1.6774, flav = [g]
+constituents:
+  pt =   0.845184, orig. flav =      [g], final flav =      [g]
+
+base jet 38: pt=0.741224 rap=0.481294 phi=1.33954, flav = [cbar ]
+IFN jet  38: pt=0.741224 rap=0.481294 phi=1.33954, flav = [g]
+constituents:
+  pt =   0.423977, orig. flav =      [g], final flav =      [g]
+  pt =   0.317445, orig. flav =  [cbar ], final flav =      [g]
+
+base jet 39: pt=0.736037 rap=-1.90851 phi=4.50608, flav = [u ]
+IFN jet  39: pt=0.736037 rap=-1.90851 phi=4.50608, flav = [g]
+constituents:
+  pt =   0.736037, orig. flav =     [u ], final flav =      [g]
+
+base jet 40: pt=0.681616 rap=5.45311 phi=3.53289, flav = [u u ]
+IFN jet  40: pt=0.681616 rap=5.45311 phi=3.53289, flav = [u u ]
+constituents:
+  pt =   0.681616, orig. flav =   [u u ], final flav =   [u u ]
+
+base jet 41: pt=0.620594 rap=-0.716159 phi=2.52013, flav = [g]
+IFN jet  41: pt=0.620594 rap=-0.716159 phi=2.52013, flav = [g]
+constituents:
+  pt =   0.620594, orig. flav =      [g], final flav =      [g]
+
+base jet 42: pt=0.611938 rap=4.29183 phi=0.984259, flav = [d ]
+IFN jet  42: pt=0.611938 rap=4.29183 phi=0.984259, flav = [g]
+constituents:
+  pt =   0.611938, orig. flav =     [d ], final flav =      [g]
+
+base jet 43: pt=0.573457 rap=4.45941 phi=2.65817, flav = [dbar ]
+IFN jet  43: pt=0.573457 rap=4.45941 phi=2.65817, flav = [dbar ]
+constituents:
+  pt =   0.573457, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 44: pt=0.55851 rap=1.78007 phi=4.71025, flav = [g]
+IFN jet  44: pt=0.55851 rap=1.78007 phi=4.71025, flav = [g]
+constituents:
+  pt =    0.55851, orig. flav =      [g], final flav =      [g]
+
+base jet 45: pt=0.524854 rap=1.09899 phi=5.12445, flav = [sbar ]
+IFN jet  45: pt=0.524854 rap=1.09899 phi=5.12445, flav = [sbar ]
+constituents:
+  pt =   0.524854, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 46: pt=0.524141 rap=1.92472 phi=6.10194, flav = [d ]
+IFN jet  46: pt=0.524141 rap=1.92472 phi=6.10194, flav = [g]
+constituents:
+  pt =   0.524141, orig. flav =     [d ], final flav =      [g]
+
+base jet 47: pt=0.51969 rap=-0.568329 phi=3.69806, flav = [t ]
+IFN jet  47: pt=0.51969 rap=-0.568329 phi=3.69806, flav = [g]
+constituents:
+  pt =   0.306612, orig. flav =      [g], final flav =      [g]
+  pt =    0.21377, orig. flav =     [t ], final flav =      [g]
+
+base jet 48: pt=0.501863 rap=1.06045 phi=1.63218, flav = [dbar ]
+IFN jet  48: pt=0.501863 rap=1.06045 phi=1.63218, flav = [g]
+constituents:
+  pt =   0.501863, orig. flav =  [dbar ], final flav =      [g]
+
+base jet 49: pt=0.490545 rap=-1.52154 phi=3.80641, flav = [cbar ]
+IFN jet  49: pt=0.490545 rap=-1.52154 phi=3.80641, flav = [g]
+constituents:
+  pt =   0.490545, orig. flav =  [cbar ], final flav =      [g]
+
+base jet 50: pt=0.455524 rap=3.31398 phi=1.5314, flav = [dbar ]
+IFN jet  50: pt=0.455524 rap=3.31398 phi=1.5314, flav = [g]
+constituents:
+  pt =   0.455524, orig. flav =  [dbar ], final flav =      [g]
+
+base jet 51: pt=0.432599 rap=3.61361 phi=1.03093, flav = [g]
+IFN jet  51: pt=0.432599 rap=3.61361 phi=1.03093, flav = [g]
+constituents:
+  pt =   0.432599, orig. flav =      [g], final flav =      [g]
+
+base jet 52: pt=0.417599 rap=0.300434 phi=2.8921, flav = [c ]
+IFN jet  52: pt=0.417599 rap=0.300434 phi=2.8921, flav = [g]
+constituents:
+  pt =   0.417599, orig. flav =     [c ], final flav =      [g]
+
+base jet 53: pt=0.404257 rap=-1.24984 phi=2.84145, flav = [c ]
+IFN jet  53: pt=0.404257 rap=-1.24984 phi=2.84145, flav = [g]
+constituents:
+  pt =   0.404257, orig. flav =     [c ], final flav =      [g]
+
+base jet 54: pt=0.371215 rap=3.30524 phi=3.6266, flav = [g]
+IFN jet  54: pt=0.371215 rap=3.30524 phi=3.6266, flav = [g]
+constituents:
+  pt =   0.371215, orig. flav =      [g], final flav =      [g]
+
+base jet 55: pt=0.356397 rap=-7.75615 phi=4.44784, flav = [d u ]
+IFN jet  55: pt=0.356397 rap=-7.75615 phi=4.44784, flav = [d u ]
+constituents:
+  pt =   0.356397, orig. flav =   [d u ], final flav =   [d u ]
+
+base jet 56: pt=0.333612 rap=-3.56714 phi=3.02511, flav = [sbar ]
+IFN jet  56: pt=0.333612 rap=-3.56714 phi=3.02511, flav = [sbar ]
+constituents:
+  pt =   0.333612, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 57: pt=0.285804 rap=-4.56977 phi=2.47844, flav = [u ]
+IFN jet  57: pt=0.285804 rap=-4.56977 phi=2.47844, flav = [u ]
+constituents:
+  pt =   0.285804, orig. flav =     [u ], final flav =     [u ]
+
+base jet 58: pt=0.278429 rap=-0.558429 phi=0.073587, flav = [g]
+IFN jet  58: pt=0.278429 rap=-0.558429 phi=0.073587, flav = [g]
+constituents:
+  pt =   0.278429, orig. flav =      [g], final flav =      [g]
+
+base jet 59: pt=0.24573 rap=4.30836 phi=1.38816, flav = [g]
+IFN jet  59: pt=0.24573 rap=4.30836 phi=1.38816, flav = [g]
+constituents:
+  pt =    0.24573, orig. flav =      [g], final flav =      [g]
+
+base jet 60: pt=0.191944 rap=0.853899 phi=2.0019, flav = [g]
+IFN jet  60: pt=0.191944 rap=0.853899 phi=2.0019, flav = [g]
+constituents:
+  pt =   0.191944, orig. flav =      [g], final flav =      [g]
+
+base jet 61: pt=0.163946 rap=3.50701 phi=5.0516, flav = [g]
+IFN jet  61: pt=0.163946 rap=3.50701 phi=5.0516, flav = [g]
+constituents:
+  pt =   0.163946, orig. flav =      [g], final flav =      [g]
+
+base jet 62: pt=0.0922454 rap=1.64675 phi=2.57917, flav = [g]
+IFN jet  62: pt=0.0922454 rap=1.64675 phi=2.57917, flav = [g]
+constituents:
+  pt =  0.0922454, orig. flav =      [g], final flav =      [g]
+
+base jet 63: pt=0.077441 rap=3.56506 phi=4.58451, flav = [ubar ]
+IFN jet  63: pt=0.077441 rap=3.56506 phi=4.58451, flav = [g]
+constituents:
+  pt =   0.077441, orig. flav =  [ubar ], final flav =      [g]
+
+base jet 64: pt=0.0505622 rap=1.78424 phi=0.528645, flav = [u ]
+IFN jet  64: pt=0.0505622 rap=1.78424 phi=0.528645, flav = [g]
+constituents:
+  pt =  0.0505622, orig. flav =     [u ], final flav =      [g]
+
+base jet 65: pt=0.000136378 rap=0.33941 phi=2.23264, flav = [g]
+IFN jet  65: pt=0.000136378 rap=0.33941 phi=2.23264, flav = [g]
+constituents:
+  pt = 0.000136378, orig. flav =      [g], final flav =      [g]
+
+#---------------------------------------------------------------
+# read event 6 with 33 particles
+
+base jet 0: pt=108.088 rap=0.864675 phi=1.32688, flav = [d u cbar tbar ]
+IFN jet  0: pt=108.088 rap=0.864675 phi=1.32688, flav = [d u cbar bbar tbar ]
+constituents:
+  pt =    27.7343, orig. flav =  [bbar ], final flav =  [bbar ]
+  pt =    25.2055, orig. flav =     [u ], final flav =     [u ]
+  pt =    14.7408, orig. flav =     [u ], final flav =      [g]
+  pt =    7.16849, orig. flav =  [tbar ], final flav =  [tbar ]
+  pt =      6.876, orig. flav =  [ubar ], final flav =      [g]
+  pt =    5.46076, orig. flav =      [g], final flav =      [g]
+  pt =    5.33612, orig. flav =  [cbar ], final flav =  [cbar ]
+  pt =     4.3037, orig. flav =      [g], final flav =      [g]
+  pt =    4.12394, orig. flav =     [b ], final flav =      [g]
+  pt =    3.79226, orig. flav =      [g], final flav =      [g]
+  pt =    2.16871, orig. flav =      [g], final flav =      [g]
+  pt =    1.06538, orig. flav =      [g], final flav =      [g]
+  pt =   0.939285, orig. flav =     [d ], final flav =     [d ]
+
+base jet 1: pt=2.86396 rap=-1.68539 phi=4.29098, flav = [cbar ]
+IFN jet  1: pt=2.86396 rap=-1.68539 phi=4.29098, flav = [cbar ]
+constituents:
+  pt =    1.46691, orig. flav =      [g], final flav =      [g]
+  pt =    1.43729, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 2: pt=2.39178 rap=4.42295 phi=3.66959, flav = [cbar ]
+IFN jet  2: pt=2.39178 rap=4.42295 phi=3.66959, flav = [cbar ]
+constituents:
+  pt =    2.39178, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 3: pt=1.54024 rap=6.46583 phi=3.96646, flav = [u u ]
+IFN jet  3: pt=1.54024 rap=6.46583 phi=3.96646, flav = [u u ]
+constituents:
+  pt =    1.54024, orig. flav =   [u u ], final flav =   [u u ]
+
+base jet 4: pt=1.39411 rap=0.46637 phi=1.18941, flav = [sbar ]
+IFN jet  4: pt=1.39411 rap=0.46637 phi=1.18941, flav = [sbar ]
+constituents:
+  pt =    1.39411, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 5: pt=1.10904 rap=-0.112969 phi=1.10605, flav = [bbar ]
+IFN jet  5: pt=1.10904 rap=-0.112969 phi=1.10605, flav = [g]
+constituents:
+  pt =    1.10904, orig. flav =  [bbar ], final flav =      [g]
+
+base jet 6: pt=0.975215 rap=3.92022 phi=0.426372, flav = [g]
+IFN jet  6: pt=0.975215 rap=3.92022 phi=0.426372, flav = [g]
+constituents:
+  pt =   0.975215, orig. flav =      [g], final flav =      [g]
+
+base jet 7: pt=0.90555 rap=1.66034 phi=2.35185, flav = [s ]
+IFN jet  7: pt=0.90555 rap=1.66034 phi=2.35185, flav = [s ]
+constituents:
+  pt =    0.90555, orig. flav =     [s ], final flav =     [s ]
+
+base jet 8: pt=0.893624 rap=4.05149 phi=0.0378413, flav = [ubar ]
+IFN jet  8: pt=0.893624 rap=4.05149 phi=0.0378413, flav = [ubar ]
+constituents:
+  pt =   0.893624, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 9: pt=0.695739 rap=1.86191 phi=5.44268, flav = [g]
+IFN jet  9: pt=0.695739 rap=1.86191 phi=5.44268, flav = [g]
+constituents:
+  pt =   0.695739, orig. flav =      [g], final flav =      [g]
+
+base jet 10: pt=0.678007 rap=4.60405 phi=1.05842, flav = [g]
+IFN jet  10: pt=0.678007 rap=4.60405 phi=1.05842, flav = [g]
+constituents:
+  pt =   0.678007, orig. flav =      [g], final flav =      [g]
+
+base jet 11: pt=0.600427 rap=-6.75668 phi=4.98589, flav = [d ]
+IFN jet  11: pt=0.600427 rap=-6.75668 phi=4.98589, flav = [d ]
+constituents:
+  pt =   0.600427, orig. flav =     [d ], final flav =     [d ]
+
+base jet 12: pt=0.576369 rap=-5.61554 phi=4.04283, flav = [u u ]
+IFN jet  12: pt=0.576369 rap=-5.61554 phi=4.04283, flav = [u u ]
+constituents:
+  pt =   0.576369, orig. flav =   [u u ], final flav =   [u u ]
+
+base jet 13: pt=0.533192 rap=1.68684 phi=4.03219, flav = [sbar ]
+IFN jet  13: pt=0.533192 rap=1.68684 phi=4.03219, flav = [sbar ]
+constituents:
+  pt =   0.533192, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 14: pt=0.498602 rap=-3.10784 phi=2.04505, flav = [b ]
+IFN jet  14: pt=0.498602 rap=-3.10784 phi=2.04505, flav = [b ]
+constituents:
+  pt =   0.498602, orig. flav =     [b ], final flav =     [b ]
+
+base jet 15: pt=0.293106 rap=3.03148 phi=0.86342, flav = [sbar ]
+IFN jet  15: pt=0.293106 rap=3.03148 phi=0.86342, flav = [sbar ]
+constituents:
+  pt =   0.293106, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 16: pt=0.247259 rap=-7.77504 phi=4.93117, flav = [d ]
+IFN jet  16: pt=0.247259 rap=-7.77504 phi=4.93117, flav = [d ]
+constituents:
+  pt =   0.247259, orig. flav =     [d ], final flav =     [d ]
+
+base jet 17: pt=0.196 rap=-0.543337 phi=3.95017, flav = [g]
+IFN jet  17: pt=0.196 rap=-0.543337 phi=3.95017, flav = [g]
+constituents:
+  pt =      0.196, orig. flav =      [g], final flav =      [g]
+
+base jet 18: pt=0.132232 rap=-2.46262 phi=1.16502, flav = [ubar ]
+IFN jet  18: pt=0.132232 rap=-2.46262 phi=1.16502, flav = [ubar ]
+constituents:
+  pt =   0.132232, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 19: pt=0.110357 rap=5.42352 phi=0.391056, flav = [g]
+IFN jet  19: pt=0.110357 rap=5.42352 phi=0.391056, flav = [g]
+constituents:
+  pt =   0.110357, orig. flav =      [g], final flav =      [g]
+
+#---------------------------------------------------------------
+# read event 7 with 94 particles
+
+base jet 0: pt=100.043 rap=0.69771 phi=5.94573, flav = [s ]
+IFN jet  0: pt=100.043 rap=0.69771 phi=5.94573, flav = [b ]
+constituents:
+  pt =       71.3, orig. flav =     [b ], final flav =     [b ]
+  pt =    16.9088, orig. flav =  [bbar ], final flav =      [g]
+  pt =    5.72472, orig. flav =      [g], final flav =      [g]
+  pt =    4.14052, orig. flav =      [g], final flav =      [g]
+  pt =     2.1564, orig. flav =      [g], final flav =      [g]
+  pt =   0.359787, orig. flav =      [g], final flav =      [g]
+  pt =   0.184212, orig. flav =     [s ], final flav =      [g]
+
+base jet 1: pt=20.1253 rap=-0.0197745 phi=6.19708, flav = [d t ]
+IFN jet  1: pt=20.1253 rap=-0.0197745 phi=6.19708, flav = [d t ]
+constituents:
+  pt =    13.1922, orig. flav =     [t ], final flav =     [t ]
+  pt =    4.59694, orig. flav =     [d ], final flav =     [d ]
+  pt =    2.35363, orig. flav =      [g], final flav =      [g]
+
+base jet 2: pt=6.10882 rap=0.418633 phi=0.0728016, flav = [cbar b ]
+IFN jet  2: pt=6.10882 rap=0.418633 phi=0.0728016, flav = [cbar ]
+constituents:
+  pt =    5.05907, orig. flav =     [b ], final flav =      [g]
+  pt =    1.07335, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 3: pt=6.0838 rap=0.00974429 phi=5.55987, flav = [dbar ]
+IFN jet  3: pt=6.0838 rap=0.00974429 phi=5.55987, flav = [dbar ]
+constituents:
+  pt =    5.68154, orig. flav =  [dbar ], final flav =  [dbar ]
+  pt =   0.409733, orig. flav =      [g], final flav =      [g]
+
+base jet 4: pt=5.01801 rap=-0.709537 phi=1.47505, flav = [dbar cbar bbar ]
+IFN jet  4: pt=5.01801 rap=-0.709537 phi=1.47505, flav = [dbar cbar bbar ]
+constituents:
+  pt =    4.07257, orig. flav =  [bbar ], final flav =  [bbar ]
+  pt =   0.481526, orig. flav =  [dbar ], final flav =  [dbar ]
+  pt =   0.473631, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 5: pt=4.02914 rap=2.68799 phi=5.45891, flav = [u ]
+IFN jet  5: pt=4.02914 rap=2.68799 phi=5.45891, flav = [u ]
+constituents:
+  pt =    4.02914, orig. flav =     [u ], final flav =     [u ]
+
+base jet 6: pt=3.7647 rap=-0.051307 phi=2.18793, flav = [tbar ]
+IFN jet  6: pt=3.7647 rap=-0.051307 phi=2.18793, flav = [tbar ]
+constituents:
+  pt =    2.93008, orig. flav =      [g], final flav =      [g]
+  pt =   0.578734, orig. flav =      [g], final flav =      [g]
+  pt =   0.271102, orig. flav =  [tbar ], final flav =  [tbar ]
+  pt = 0.00043014, orig. flav =      [g], final flav =      [g]
+
+base jet 7: pt=3.35288 rap=-3.29726 phi=4.71972, flav = [tbar ]
+IFN jet  7: pt=3.35288 rap=-3.29726 phi=4.71972, flav = [tbar ]
+constituents:
+  pt =    3.04181, orig. flav =      [g], final flav =      [g]
+  pt =   0.334572, orig. flav =  [tbar ], final flav =  [tbar ]
+
+base jet 8: pt=3.08731 rap=-1.48716 phi=2.65707, flav = [d tbar ]
+IFN jet  8: pt=3.08731 rap=-1.48716 phi=2.65707, flav = [d tbar ]
+constituents:
+  pt =    1.61575, orig. flav =  [tbar ], final flav =  [tbar ]
+  pt =    1.47586, orig. flav =     [d ], final flav =     [d ]
+
+base jet 9: pt=2.64693 rap=-4.17746 phi=5.98502, flav = [g]
+IFN jet  9: pt=2.64693 rap=-4.17746 phi=5.98502, flav = [g]
+constituents:
+  pt =    2.44005, orig. flav =      [g], final flav =      [g]
+  pt =    0.20688, orig. flav =      [g], final flav =      [g]
+
+base jet 10: pt=2.51591 rap=2.12214 phi=1.06596, flav = [b ]
+IFN jet  10: pt=2.51591 rap=2.12214 phi=1.06596, flav = [b ]
+constituents:
+  pt =    1.51211, orig. flav =     [b ], final flav =     [b ]
+  pt =    1.04596, orig. flav =      [g], final flav =      [g]
+
+base jet 11: pt=2.12986 rap=2.50003 phi=2.81918, flav = [g]
+IFN jet  11: pt=2.12986 rap=2.50003 phi=2.81918, flav = [g]
+constituents:
+  pt =    2.12986, orig. flav =      [g], final flav =      [g]
+
+base jet 12: pt=2.09818 rap=3.38805 phi=5.80633, flav = [g]
+IFN jet  12: pt=2.09818 rap=3.38805 phi=5.80633, flav = [g]
+constituents:
+  pt =    2.09818, orig. flav =      [g], final flav =      [g]
+
+base jet 13: pt=2.04001 rap=-1.08864 phi=1.58205, flav = [g]
+IFN jet  13: pt=2.04001 rap=-1.08864 phi=1.58205, flav = [g]
+constituents:
+  pt =     1.4158, orig. flav =      [g], final flav =      [g]
+  pt =   0.639176, orig. flav =      [g], final flav =      [g]
+
+base jet 14: pt=2.02355 rap=2.8502 phi=3.3782, flav = [d s ]
+IFN jet  14: pt=2.02355 rap=2.8502 phi=3.3782, flav = [d s ]
+constituents:
+  pt =    1.15067, orig. flav =     [s ], final flav =     [s ]
+  pt =   0.874147, orig. flav =     [d ], final flav =     [d ]
+
+base jet 15: pt=1.89426 rap=-3.98317 phi=3.07242, flav = [bbar ]
+IFN jet  15: pt=1.89426 rap=-3.98317 phi=3.07242, flav = [bbar ]
+constituents:
+  pt =    1.89426, orig. flav =  [bbar ], final flav =  [bbar ]
+
+base jet 16: pt=1.65567 rap=0.847511 phi=3.14292, flav = [sbar ]
+IFN jet  16: pt=1.65567 rap=0.847511 phi=3.14292, flav = [sbar ]
+constituents:
+  pt =   0.775803, orig. flav =  [sbar ], final flav =  [sbar ]
+  pt =   0.629538, orig. flav =      [g], final flav =      [g]
+  pt =   0.275597, orig. flav =      [g], final flav =      [g]
+
+base jet 17: pt=1.54193 rap=-1.84395 phi=5.93289, flav = [u b ]
+IFN jet  17: pt=1.54193 rap=-1.84395 phi=5.93289, flav = [u b ]
+constituents:
+  pt =    1.49707, orig. flav =     [u ], final flav =     [u ]
+  pt =  0.0469853, orig. flav =     [b ], final flav =     [b ]
+
+base jet 18: pt=1.53931 rap=-3.71442 phi=6.17119, flav = [dbar ]
+IFN jet  18: pt=1.53931 rap=-3.71442 phi=6.17119, flav = [dbar ]
+constituents:
+  pt =    1.53931, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 19: pt=1.53742 rap=0.314811 phi=5.82036, flav = [g]
+IFN jet  19: pt=1.53742 rap=0.314811 phi=5.82036, flav = [g]
+constituents:
+  pt =    1.53742, orig. flav =      [g], final flav =      [g]
+
+base jet 20: pt=1.45927 rap=0.91276 phi=0.67525, flav = [dbar s s ]
+IFN jet  20: pt=1.45927 rap=0.91276 phi=0.67525, flav = [dbar s s ]
+constituents:
+  pt =   0.998424, orig. flav =     [s ], final flav =     [s ]
+  pt =   0.253251, orig. flav =      [g], final flav =      [g]
+  pt =   0.132804, orig. flav =  [dbar ], final flav =  [dbar ]
+  pt =  0.0904704, orig. flav =     [s ], final flav =     [s ]
+
+base jet 21: pt=1.39796 rap=-0.818449 phi=1.00365, flav = [g]
+IFN jet  21: pt=1.39796 rap=-0.818449 phi=1.00365, flav = [g]
+constituents:
+  pt =    1.39796, orig. flav =      [g], final flav =      [g]
+
+base jet 22: pt=1.3216 rap=2.1139 phi=1.88361, flav = [g]
+IFN jet  22: pt=1.3216 rap=2.1139 phi=1.88361, flav = [g]
+constituents:
+  pt =     1.3216, orig. flav =      [g], final flav =      [g]
+
+base jet 23: pt=1.30306 rap=-1.67021 phi=4.0526, flav = [g]
+IFN jet  23: pt=1.30306 rap=-1.67021 phi=4.0526, flav = [g]
+constituents:
+  pt =   0.820865, orig. flav =      [g], final flav =      [g]
+  pt =   0.487904, orig. flav =      [g], final flav =      [g]
+
+base jet 24: pt=1.26129 rap=0.141311 phi=3.50041, flav = [g]
+IFN jet  24: pt=1.26129 rap=0.141311 phi=3.50041, flav = [g]
+constituents:
+  pt =   0.709297, orig. flav =      [g], final flav =      [g]
+  pt =   0.552087, orig. flav =      [g], final flav =      [g]
+
+base jet 25: pt=1.25112 rap=4.81576 phi=3.55546, flav = [u ]
+IFN jet  25: pt=1.25112 rap=4.81576 phi=3.55546, flav = [u ]
+constituents:
+  pt =    1.25112, orig. flav =     [u ], final flav =     [u ]
+
+base jet 26: pt=1.15424 rap=-1.97734 phi=1.69049, flav = [cbar ]
+IFN jet  26: pt=1.15424 rap=-1.97734 phi=1.69049, flav = [cbar ]
+constituents:
+  pt =   0.700773, orig. flav =  [cbar ], final flav =  [cbar ]
+  pt =   0.457504, orig. flav =      [g], final flav =      [g]
+
+base jet 27: pt=1.15412 rap=-1.08305 phi=0.168866, flav = [g]
+IFN jet  27: pt=1.15412 rap=-1.08305 phi=0.168866, flav = [g]
+constituents:
+  pt =    1.15412, orig. flav =      [g], final flav =      [g]
+
+base jet 28: pt=1.07441 rap=-2.87871 phi=5.70802, flav = [g]
+IFN jet  28: pt=1.07441 rap=-2.87871 phi=5.70802, flav = [g]
+constituents:
+  pt =    1.07441, orig. flav =      [g], final flav =      [g]
+
+base jet 29: pt=1.07243 rap=1.20838 phi=5.47757, flav = [sbar sbar ]
+IFN jet  29: pt=1.07243 rap=1.20838 phi=5.47757, flav = [sbar ]
+constituents:
+  pt =   0.921244, orig. flav =  [sbar ], final flav =  [sbar ]
+  pt =   0.151724, orig. flav =  [sbar ], final flav =      [g]
+
+base jet 30: pt=0.944379 rap=1.96605 phi=3.56808, flav = [g]
+IFN jet  30: pt=0.944379 rap=1.96605 phi=3.56808, flav = [g]
+constituents:
+  pt =   0.944379, orig. flav =      [g], final flav =      [g]
+
+base jet 31: pt=0.937456 rap=1.17551 phi=4.98034, flav = [d ]
+IFN jet  31: pt=0.937456 rap=1.17551 phi=4.98034, flav = [d ]
+constituents:
+  pt =   0.937456, orig. flav =     [d ], final flav =     [d ]
+
+base jet 32: pt=0.793721 rap=6.97727 phi=3.90913, flav = [d u ]
+IFN jet  32: pt=0.793721 rap=6.97727 phi=3.90913, flav = [d u ]
+constituents:
+  pt =   0.793721, orig. flav =   [d u ], final flav =   [d u ]
+
+base jet 33: pt=0.75007 rap=-1.31398 phi=1.99757, flav = [cbar ]
+IFN jet  33: pt=0.75007 rap=-1.31398 phi=1.99757, flav = [cbar ]
+constituents:
+  pt =    0.75007, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 34: pt=0.693642 rap=2.03927 phi=5.73989, flav = [ubar ]
+IFN jet  34: pt=0.693642 rap=2.03927 phi=5.73989, flav = [ubar ]
+constituents:
+  pt =   0.693642, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 35: pt=0.656282 rap=-6.61917 phi=2.88598, flav = [d ]
+IFN jet  35: pt=0.656282 rap=-6.61917 phi=2.88598, flav = [d ]
+constituents:
+  pt =   0.656282, orig. flav =     [d ], final flav =     [d ]
+
+base jet 36: pt=0.628089 rap=-0.557147 phi=0.642404, flav = [g]
+IFN jet  36: pt=0.628089 rap=-0.557147 phi=0.642404, flav = [g]
+constituents:
+  pt =   0.628089, orig. flav =      [g], final flav =      [g]
+
+base jet 37: pt=0.612467 rap=-1.38571 phi=3.28684, flav = [c ]
+IFN jet  37: pt=0.612467 rap=-1.38571 phi=3.28684, flav = [c ]
+constituents:
+  pt =   0.612467, orig. flav =     [c ], final flav =     [c ]
+
+base jet 38: pt=0.518823 rap=-0.635398 phi=1.98669, flav = [g]
+IFN jet  38: pt=0.518823 rap=-0.635398 phi=1.98669, flav = [g]
+constituents:
+  pt =   0.518823, orig. flav =      [g], final flav =      [g]
+
+base jet 39: pt=0.512144 rap=-6.29505 phi=2.25328, flav = [u u ]
+IFN jet  39: pt=0.512144 rap=-6.29505 phi=2.25328, flav = [u u ]
+constituents:
+  pt =   0.512144, orig. flav =   [u u ], final flav =   [u u ]
+
+base jet 40: pt=0.496233 rap=1.49261 phi=1.67568, flav = [g]
+IFN jet  40: pt=0.496233 rap=1.49261 phi=1.67568, flav = [g]
+constituents:
+  pt =   0.496233, orig. flav =      [g], final flav =      [g]
+
+base jet 41: pt=0.496007 rap=-1.15019 phi=5.85232, flav = [g]
+IFN jet  41: pt=0.496007 rap=-1.15019 phi=5.85232, flav = [g]
+constituents:
+  pt =   0.496007, orig. flav =      [g], final flav =      [g]
+
+base jet 42: pt=0.451954 rap=1.84306 phi=6.20175, flav = [g]
+IFN jet  42: pt=0.451954 rap=1.84306 phi=6.20175, flav = [g]
+constituents:
+  pt =   0.451954, orig. flav =      [g], final flav =      [g]
+
+base jet 43: pt=0.398146 rap=-2.95606 phi=3.49302, flav = [dbar ]
+IFN jet  43: pt=0.398146 rap=-2.95606 phi=3.49302, flav = [dbar ]
+constituents:
+  pt =   0.398146, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 44: pt=0.385503 rap=2.02407 phi=3.03554, flav = [bbar ]
+IFN jet  44: pt=0.385503 rap=2.02407 phi=3.03554, flav = [bbar ]
+constituents:
+  pt =   0.385503, orig. flav =  [bbar ], final flav =  [bbar ]
+
+base jet 45: pt=0.383139 rap=-0.363772 phi=2.73817, flav = [cbar ]
+IFN jet  45: pt=0.383139 rap=-0.363772 phi=2.73817, flav = [cbar ]
+constituents:
+  pt =   0.239726, orig. flav =      [g], final flav =      [g]
+  pt =   0.145812, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 46: pt=0.365497 rap=-3.62612 phi=1.73476, flav = [c ]
+IFN jet  46: pt=0.365497 rap=-3.62612 phi=1.73476, flav = [c ]
+constituents:
+  pt =   0.365497, orig. flav =     [c ], final flav =     [c ]
+
+base jet 47: pt=0.353789 rap=-5.04981 phi=3.60919, flav = [ubar ]
+IFN jet  47: pt=0.353789 rap=-5.04981 phi=3.60919, flav = [ubar ]
+constituents:
+  pt =   0.353789, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 48: pt=0.34127 rap=1.4751 phi=3.85587, flav = [sbar ]
+IFN jet  48: pt=0.34127 rap=1.4751 phi=3.85587, flav = [sbar ]
+constituents:
+  pt =    0.34127, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 49: pt=0.337966 rap=-1.54452 phi=1.55881, flav = [bbar ]
+IFN jet  49: pt=0.337966 rap=-1.54452 phi=1.55881, flav = [bbar ]
+constituents:
+  pt =   0.337966, orig. flav =  [bbar ], final flav =  [bbar ]
+
+base jet 50: pt=0.316298 rap=-2.26544 phi=6.03144, flav = [g]
+IFN jet  50: pt=0.316298 rap=-2.26544 phi=6.03144, flav = [g]
+constituents:
+  pt =   0.316298, orig. flav =      [g], final flav =      [g]
+
+base jet 51: pt=0.276263 rap=-2.49165 phi=0.129153, flav = [dbar ]
+IFN jet  51: pt=0.276263 rap=-2.49165 phi=0.129153, flav = [dbar ]
+constituents:
+  pt =   0.276263, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 52: pt=0.27515 rap=0.950918 phi=2.10485, flav = [g]
+IFN jet  52: pt=0.27515 rap=0.950918 phi=2.10485, flav = [g]
+constituents:
+  pt =    0.27515, orig. flav =      [g], final flav =      [g]
+
+base jet 53: pt=0.247699 rap=0.8706 phi=1.59508, flav = [g]
+IFN jet  53: pt=0.247699 rap=0.8706 phi=1.59508, flav = [g]
+constituents:
+  pt =   0.247699, orig. flav =      [g], final flav =      [g]
+
+base jet 54: pt=0.240553 rap=3.53152 phi=4.14137, flav = [ubar ]
+IFN jet  54: pt=0.240553 rap=3.53152 phi=4.14137, flav = [ubar ]
+constituents:
+  pt =   0.240553, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 55: pt=0.233844 rap=-2.51833 phi=2.57197, flav = [g]
+IFN jet  55: pt=0.233844 rap=-2.51833 phi=2.57197, flav = [g]
+constituents:
+  pt =   0.233844, orig. flav =      [g], final flav =      [g]
+
+base jet 56: pt=0.178675 rap=-2.11337 phi=3.56086, flav = [s ]
+IFN jet  56: pt=0.178675 rap=-2.11337 phi=3.56086, flav = [s ]
+constituents:
+  pt =   0.178675, orig. flav =     [s ], final flav =     [s ]
+
+base jet 57: pt=0.168943 rap=-4.88523 phi=1.45096, flav = [g]
+IFN jet  57: pt=0.168943 rap=-4.88523 phi=1.45096, flav = [g]
+constituents:
+  pt =   0.168943, orig. flav =      [g], final flav =      [g]
+
+base jet 58: pt=0.145181 rap=0.113626 phi=1.7583, flav = [b ]
+IFN jet  58: pt=0.145181 rap=0.113626 phi=1.7583, flav = [b ]
+constituents:
+  pt =   0.145181, orig. flav =     [b ], final flav =     [b ]
+
+base jet 59: pt=0.144486 rap=-3.69514 phi=5.05525, flav = [dbar ]
+IFN jet  59: pt=0.144486 rap=-3.69514 phi=5.05525, flav = [dbar ]
+constituents:
+  pt =   0.144486, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 60: pt=0.0509278 rap=-2.3873 phi=3.06938, flav = [ubar ]
+IFN jet  60: pt=0.0509278 rap=-2.3873 phi=3.06938, flav = [ubar ]
+constituents:
+  pt =  0.0509278, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 61: pt=0.034093 rap=-1.49812 phi=4.68863, flav = [g]
+IFN jet  61: pt=0.034093 rap=-1.49812 phi=4.68863, flav = [g]
+constituents:
+  pt =   0.034093, orig. flav =      [g], final flav =      [g]
+
+#---------------------------------------------------------------
+# read event 8 with 54 particles
+
+base jet 0: pt=115.562 rap=-0.0319995 phi=0.98162, flav = [s s bbar ]
+IFN jet  0: pt=115.562 rap=-0.0319995 phi=0.98162, flav = [s s bbar ]
+constituents:
+  pt =    39.7603, orig. flav =     [d ], final flav =     [d ]
+  pt =    39.4111, orig. flav =     [s ], final flav =     [s ]
+  pt =    10.7681, orig. flav =  [bbar ], final flav =  [bbar ]
+  pt =    7.84577, orig. flav =      [g], final flav =      [g]
+  pt =    7.61929, orig. flav =      [g], final flav =      [g]
+  pt =    4.14959, orig. flav =     [s ], final flav =     [s ]
+  pt =    3.10819, orig. flav =      [g], final flav =      [g]
+  pt =    1.93998, orig. flav =      [g], final flav =      [g]
+  pt =    1.41042, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 1: pt=19.9284 rap=-0.828988 phi=2.77712, flav = [d ]
+IFN jet  1: pt=19.9284 rap=-0.828988 phi=2.77712, flav = [g]
+constituents:
+  pt =    13.3616, orig. flav =      [g], final flav =      [g]
+  pt =    4.08276, orig. flav =      [g], final flav =      [g]
+  pt =    2.34136, orig. flav =      [g], final flav =      [g]
+  pt =   0.330765, orig. flav =     [d ], final flav =      [g]
+
+base jet 2: pt=18.6118 rap=-1.09124 phi=4.95011, flav = [u ]
+IFN jet  2: pt=18.6118 rap=-1.09124 phi=4.95011, flav = [u ]
+constituents:
+  pt =    18.6118, orig. flav =     [u ], final flav =     [u ]
+
+base jet 3: pt=6.47879 rap=-2.08208 phi=6.09873, flav = [bbar ]
+IFN jet  3: pt=6.47879 rap=-2.08208 phi=6.09873, flav = [bbar ]
+constituents:
+  pt =    4.46107, orig. flav =  [bbar ], final flav =  [bbar ]
+  pt =    2.01786, orig. flav =      [g], final flav =      [g]
+
+base jet 4: pt=4.70221 rap=0.0216587 phi=1.47711, flav = [ubar t ]
+IFN jet  4: pt=4.70221 rap=0.0216587 phi=1.47711, flav = [t ]
+constituents:
+  pt =    2.35856, orig. flav =      [g], final flav =      [g]
+  pt =    2.06678, orig. flav =     [t ], final flav =     [t ]
+  pt =   0.295006, orig. flav =  [ubar ], final flav =      [g]
+
+base jet 5: pt=3.13994 rap=-0.691291 phi=4.50375, flav = [dbar s bbar ]
+IFN jet  5: pt=3.13994 rap=-0.691291 phi=4.50375, flav = [s bbar ]
+constituents:
+  pt =    2.12292, orig. flav =     [s ], final flav =     [s ]
+  pt =   0.750056, orig. flav =  [dbar ], final flav =      [g]
+  pt =   0.303804, orig. flav =  [bbar ], final flav =  [bbar ]
+
+base jet 6: pt=2.35082 rap=-1.1166 phi=1.72703, flav = [bbar tbar ]
+IFN jet  6: pt=2.35082 rap=-1.1166 phi=1.72703, flav = [bbar tbar ]
+constituents:
+  pt =    1.04375, orig. flav =  [bbar ], final flav =  [bbar ]
+  pt =   0.884844, orig. flav =      [g], final flav =      [g]
+  pt =   0.422325, orig. flav =  [tbar ], final flav =  [tbar ]
+
+base jet 7: pt=1.95982 rap=2.64586 phi=6.04213, flav = [t ]
+IFN jet  7: pt=1.95982 rap=2.64586 phi=6.04213, flav = [t ]
+constituents:
+  pt =    1.82334, orig. flav =     [t ], final flav =     [t ]
+  pt =   0.136625, orig. flav =      [g], final flav =      [g]
+
+base jet 8: pt=1.70931 rap=1.69105 phi=4.08583, flav = [g]
+IFN jet  8: pt=1.70931 rap=1.69105 phi=4.08583, flav = [g]
+constituents:
+  pt =    1.42652, orig. flav =      [g], final flav =      [g]
+  pt =   0.284468, orig. flav =      [g], final flav =      [g]
+
+base jet 9: pt=1.50529 rap=-6.76882 phi=1.10563, flav = [d u ]
+IFN jet  9: pt=1.50529 rap=-6.76882 phi=1.10563, flav = [d u ]
+constituents:
+  pt =    1.50529, orig. flav =   [d u ], final flav =   [d u ]
+
+base jet 10: pt=1.44324 rap=-0.30942 phi=4.30172, flav = [dbar tbar ]
+IFN jet  10: pt=1.44324 rap=-0.30942 phi=4.30172, flav = [dbar tbar ]
+constituents:
+  pt =    1.05444, orig. flav =  [dbar ], final flav =  [dbar ]
+  pt =   0.400377, orig. flav =  [tbar ], final flav =  [tbar ]
+
+base jet 11: pt=1.3805 rap=6.97565 phi=3.57174, flav = [u u ]
+IFN jet  11: pt=1.3805 rap=6.97565 phi=3.57174, flav = [u u ]
+constituents:
+  pt =     1.3805, orig. flav =   [u u ], final flav =   [u u ]
+
+base jet 12: pt=1.16537 rap=-0.543484 phi=0.899606, flav = [g]
+IFN jet  12: pt=1.16537 rap=-0.543484 phi=0.899606, flav = [g]
+constituents:
+  pt =    1.16537, orig. flav =      [g], final flav =      [g]
+
+base jet 13: pt=1.09978 rap=0.671207 phi=0.274905, flav = [g]
+IFN jet  13: pt=1.09978 rap=0.671207 phi=0.274905, flav = [g]
+constituents:
+  pt =    1.09978, orig. flav =      [g], final flav =      [g]
+
+base jet 14: pt=0.790334 rap=-1.87131 phi=0.749723, flav = [d ]
+IFN jet  14: pt=0.790334 rap=-1.87131 phi=0.749723, flav = [g]
+constituents:
+  pt =   0.790334, orig. flav =     [d ], final flav =      [g]
+
+base jet 15: pt=0.709179 rap=-1.28386 phi=3.63873, flav = [b ]
+IFN jet  15: pt=0.709179 rap=-1.28386 phi=3.63873, flav = [b ]
+constituents:
+  pt =   0.553698, orig. flav =     [b ], final flav =     [b ]
+  pt =   0.159628, orig. flav =      [g], final flav =      [g]
+
+base jet 16: pt=0.60555 rap=4.24212 phi=1.46277, flav = [g]
+IFN jet  16: pt=0.60555 rap=4.24212 phi=1.46277, flav = [g]
+constituents:
+  pt =    0.60555, orig. flav =      [g], final flav =      [g]
+
+base jet 17: pt=0.587027 rap=-1.37446 phi=1.18073, flav = [dbar ]
+IFN jet  17: pt=0.587027 rap=-1.37446 phi=1.18073, flav = [g]
+constituents:
+  pt =   0.587027, orig. flav =  [dbar ], final flav =      [g]
+
+base jet 18: pt=0.577642 rap=-0.094035 phi=2.99253, flav = [g]
+IFN jet  18: pt=0.577642 rap=-0.094035 phi=2.99253, flav = [g]
+constituents:
+  pt =   0.577642, orig. flav =      [g], final flav =      [g]
+
+base jet 19: pt=0.454481 rap=-2.56721 phi=5.28579, flav = [g]
+IFN jet  19: pt=0.454481 rap=-2.56721 phi=5.28579, flav = [g]
+constituents:
+  pt =   0.454481, orig. flav =      [g], final flav =      [g]
+
+base jet 20: pt=0.355623 rap=2.4533 phi=1.26269, flav = [g]
+IFN jet  20: pt=0.355623 rap=2.4533 phi=1.26269, flav = [g]
+constituents:
+  pt =   0.355623, orig. flav =      [g], final flav =      [g]
+
+base jet 21: pt=0.327886 rap=2.64178 phi=2.3723, flav = [d ubar ]
+IFN jet  21: pt=0.327886 rap=2.64178 phi=2.3723, flav = [g]
+constituents:
+  pt =   0.327886, orig. flav = [d ubar ], final flav =      [g]
+
+base jet 22: pt=0.263993 rap=2.92169 phi=3.4442, flav = [s ]
+IFN jet  22: pt=0.263993 rap=2.92169 phi=3.4442, flav = [s ]
+constituents:
+  pt =   0.263993, orig. flav =     [s ], final flav =     [s ]
+
+base jet 23: pt=0.247987 rap=2.70088 phi=0.929617, flav = [g]
+IFN jet  23: pt=0.247987 rap=2.70088 phi=0.929617, flav = [g]
+constituents:
+  pt =   0.247987, orig. flav =      [g], final flav =      [g]
+
+base jet 24: pt=0.242465 rap=-1.04439 phi=5.86004, flav = [c ]
+IFN jet  24: pt=0.242465 rap=-1.04439 phi=5.86004, flav = [c ]
+constituents:
+  pt =   0.242465, orig. flav =     [c ], final flav =     [c ]
+
+base jet 25: pt=0.236598 rap=-0.611796 phi=3.18595, flav = [u ]
+IFN jet  25: pt=0.236598 rap=-0.611796 phi=3.18595, flav = [g]
+constituents:
+  pt =   0.236598, orig. flav =     [u ], final flav =      [g]
+
+base jet 26: pt=0.208228 rap=0.375969 phi=0.962109, flav = [g]
+IFN jet  26: pt=0.208228 rap=0.375969 phi=0.962109, flav = [g]
+constituents:
+  pt =   0.208228, orig. flav =      [g], final flav =      [g]
+
+base jet 27: pt=0.15822 rap=0.68517 phi=3.07155, flav = [dbar u ]
+IFN jet  27: pt=0.15822 rap=0.68517 phi=3.07155, flav = [g]
+constituents:
+  pt =    0.15822, orig. flav = [dbar u ], final flav =      [g]
+
+base jet 28: pt=0.113457 rap=-2.47296 phi=5.92295, flav = [g]
+IFN jet  28: pt=0.113457 rap=-2.47296 phi=5.92295, flav = [g]
+constituents:
+  pt =   0.113457, orig. flav =      [g], final flav =      [g]
+
+base jet 29: pt=0.0639358 rap=-3.32117 phi=2.44455, flav = [g]
+IFN jet  29: pt=0.0639358 rap=-3.32117 phi=2.44455, flav = [g]
+constituents:
+  pt =  0.0639358, orig. flav =      [g], final flav =      [g]
+
+base jet 30: pt=0.0495317 rap=-2.63427 phi=2.85586, flav = [g]
+IFN jet  30: pt=0.0495317 rap=-2.63427 phi=2.85586, flav = [g]
+constituents:
+  pt =  0.0495317, orig. flav =      [g], final flav =      [g]
+
+base jet 31: pt=0.0399471 rap=-1.31163 phi=0.434634, flav = [bbar ]
+IFN jet  31: pt=0.0399471 rap=-1.31163 phi=0.434634, flav = [bbar ]
+constituents:
+  pt =  0.0399471, orig. flav =  [bbar ], final flav =  [bbar ]
+
+#---------------------------------------------------------------
+# read event 9 with 83 particles
+
+base jet 0: pt=152.951 rap=-1.12892 phi=3.71297, flav = [d ubar t ]
+IFN jet  0: pt=152.951 rap=-1.12892 phi=3.71297, flav = [t ]
+constituents:
+  pt =    86.4101, orig. flav =  [sbar ], final flav =  [sbar ]
+  pt =    26.5429, orig. flav =     [s ], final flav =     [s ]
+  pt =    12.3206, orig. flav =     [t ], final flav =     [t ]
+  pt =    8.32981, orig. flav =      [g], final flav =      [g]
+  pt =    7.39747, orig. flav =     [d ], final flav =      [g]
+  pt =    5.29169, orig. flav =      [g], final flav =      [g]
+  pt =    5.24981, orig. flav =      [g], final flav =      [g]
+  pt =     1.0182, orig. flav =      [g], final flav =      [g]
+  pt =   0.700695, orig. flav =  [ubar ], final flav =      [g]
+
+base jet 1: pt=32.7921 rap=-1.47995 phi=3.14857, flav = [sbar ]
+IFN jet  1: pt=32.7921 rap=-1.47995 phi=3.14857, flav = [sbar ]
+constituents:
+  pt =    22.2349, orig. flav =  [ubar ], final flav =  [ubar ]
+  pt =    5.39818, orig. flav =  [sbar ], final flav =  [sbar ]
+  pt =    4.62581, orig. flav =     [u ], final flav =     [u ]
+  pt =   0.575164, orig. flav =      [g], final flav =      [g]
+
+base jet 2: pt=14.5434 rap=-0.236368 phi=4.20355, flav = [s ]
+IFN jet  2: pt=14.5434 rap=-0.236368 phi=4.20355, flav = [s ]
+constituents:
+  pt =    6.64008, orig. flav =     [u ], final flav =     [u ]
+  pt =    5.34996, orig. flav =      [g], final flav =      [g]
+  pt =    1.82746, orig. flav =  [ubar ], final flav =  [ubar ]
+  pt =   0.744806, orig. flav =     [s ], final flav =     [s ]
+
+base jet 3: pt=5.86654 rap=-0.108314 phi=0.65315, flav = [g]
+IFN jet  3: pt=5.86654 rap=-0.108314 phi=0.65315, flav = [g]
+constituents:
+  pt =    3.92035, orig. flav =      [g], final flav =      [g]
+  pt =    1.95023, orig. flav =      [g], final flav =      [g]
+
+base jet 4: pt=5.74416 rap=-2.32732 phi=0.756969, flav = [dbar ]
+IFN jet  4: pt=5.74416 rap=-2.32732 phi=0.756969, flav = [dbar ]
+constituents:
+  pt =    5.74416, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 5: pt=5.17296 rap=2.12147 phi=1.68231, flav = [ubar ]
+IFN jet  5: pt=5.17296 rap=2.12147 phi=1.68231, flav = [ubar ]
+constituents:
+  pt =    2.68911, orig. flav =  [ubar ], final flav =  [ubar ]
+  pt =    1.15583, orig. flav =      [g], final flav =      [g]
+  pt =   0.814153, orig. flav =      [g], final flav =      [g]
+  pt =   0.542956, orig. flav =      [g], final flav =      [g]
+
+base jet 6: pt=4.33602 rap=0.46465 phi=2.86917, flav = [b ]
+IFN jet  6: pt=4.33602 rap=0.46465 phi=2.86917, flav = [b ]
+constituents:
+  pt =     4.0004, orig. flav =      [g], final flav =      [g]
+  pt =   0.335726, orig. flav =     [b ], final flav =     [b ]
+
+base jet 7: pt=2.73099 rap=1.78889 phi=1.08078, flav = [dbar s b ]
+IFN jet  7: pt=2.73099 rap=1.78889 phi=1.08078, flav = [dbar b ]
+constituents:
+  pt =    1.92982, orig. flav =      [g], final flav =      [g]
+  pt =   0.396153, orig. flav =  [dbar ], final flav =  [dbar ]
+  pt =   0.272449, orig. flav =     [s ], final flav =      [g]
+  pt =   0.146067, orig. flav =     [b ], final flav =     [b ]
+
+base jet 8: pt=2.62421 rap=-3.75302 phi=0.131404, flav = [sbar ]
+IFN jet  8: pt=2.62421 rap=-3.75302 phi=0.131404, flav = [sbar ]
+constituents:
+  pt =    1.41036, orig. flav =  [sbar ], final flav =  [sbar ]
+  pt =    1.25461, orig. flav =      [g], final flav =      [g]
+
+base jet 9: pt=2.5069 rap=-3.13063 phi=0.752968, flav = [d ]
+IFN jet  9: pt=2.5069 rap=-3.13063 phi=0.752968, flav = [d ]
+constituents:
+  pt =     2.5069, orig. flav =     [d ], final flav =     [d ]
+
+base jet 10: pt=2.41865 rap=-5.27363 phi=5.52323, flav = [u ]
+IFN jet  10: pt=2.41865 rap=-5.27363 phi=5.52323, flav = [u ]
+constituents:
+  pt =    2.41865, orig. flav =     [u ], final flav =     [u ]
+
+base jet 11: pt=2.36685 rap=0.783227 phi=4.1126, flav = [dbar ]
+IFN jet  11: pt=2.36685 rap=0.783227 phi=4.1126, flav = [g]
+constituents:
+  pt =    1.90375, orig. flav =  [dbar ], final flav =      [g]
+  pt =    0.47744, orig. flav =      [g], final flav =      [g]
+
+base jet 12: pt=1.72118 rap=-2.04639 phi=1.19137, flav = [g]
+IFN jet  12: pt=1.72118 rap=-2.04639 phi=1.19137, flav = [g]
+constituents:
+  pt =    1.72118, orig. flav =      [g], final flav =      [g]
+
+base jet 13: pt=1.60989 rap=-2.05891 phi=3.72483, flav = [cbar ]
+IFN jet  13: pt=1.60989 rap=-2.05891 phi=3.72483, flav = [cbar ]
+constituents:
+  pt =    1.15083, orig. flav =  [cbar ], final flav =  [cbar ]
+  pt =   0.459374, orig. flav =      [g], final flav =      [g]
+
+base jet 14: pt=1.60656 rap=2.3736 phi=5.60829, flav = [ubar ]
+IFN jet  14: pt=1.60656 rap=2.3736 phi=5.60829, flav = [ubar ]
+constituents:
+  pt =    1.60656, orig. flav =  [ubar ], final flav =  [ubar ]
+
+base jet 15: pt=1.58014 rap=0.352163 phi=3.36355, flav = [d ]
+IFN jet  15: pt=1.58014 rap=0.352163 phi=3.36355, flav = [g]
+constituents:
+  pt =    1.58014, orig. flav =     [d ], final flav =      [g]
+
+base jet 16: pt=1.41626 rap=1.13344 phi=1.36331, flav = [g]
+IFN jet  16: pt=1.41626 rap=1.13344 phi=1.36331, flav = [g]
+constituents:
+  pt =    1.41626, orig. flav =      [g], final flav =      [g]
+
+base jet 17: pt=1.37282 rap=-0.174236 phi=3.40338, flav = [g]
+IFN jet  17: pt=1.37282 rap=-0.174236 phi=3.40338, flav = [g]
+constituents:
+  pt =    1.37282, orig. flav =      [g], final flav =      [g]
+
+base jet 18: pt=1.25878 rap=0.843536 phi=0.276936, flav = [g]
+IFN jet  18: pt=1.25878 rap=0.843536 phi=0.276936, flav = [g]
+constituents:
+  pt =    1.25878, orig. flav =      [g], final flav =      [g]
+
+base jet 19: pt=1.08516 rap=1.45988 phi=0.801117, flav = [g]
+IFN jet  19: pt=1.08516 rap=1.45988 phi=0.801117, flav = [g]
+constituents:
+  pt =    1.08516, orig. flav =      [g], final flav =      [g]
+
+base jet 20: pt=1.03617 rap=0.344136 phi=3.85723, flav = [s ]
+IFN jet  20: pt=1.03617 rap=0.344136 phi=3.85723, flav = [s ]
+constituents:
+  pt =   0.563972, orig. flav =      [g], final flav =      [g]
+  pt =   0.472635, orig. flav =     [s ], final flav =     [s ]
+
+base jet 21: pt=0.993687 rap=1.28638 phi=2.04483, flav = [g]
+IFN jet  21: pt=0.993687 rap=1.28638 phi=2.04483, flav = [g]
+constituents:
+  pt =    0.70915, orig. flav =     [b ], final flav =      [g]
+  pt =   0.296073, orig. flav =  [bbar ], final flav =      [g]
+
+base jet 22: pt=0.916153 rap=4.35779 phi=3.16858, flav = [d ]
+IFN jet  22: pt=0.916153 rap=4.35779 phi=3.16858, flav = [d ]
+constituents:
+  pt =   0.916153, orig. flav =     [d ], final flav =     [d ]
+
+base jet 23: pt=0.893929 rap=7.10653 phi=2.90556, flav = [d u ]
+IFN jet  23: pt=0.893929 rap=7.10653 phi=2.90556, flav = [d u ]
+constituents:
+  pt =   0.893929, orig. flav =   [d u ], final flav =   [d u ]
+
+base jet 24: pt=0.826875 rap=3.76396 phi=3.0137, flav = [g]
+IFN jet  24: pt=0.826875 rap=3.76396 phi=3.0137, flav = [g]
+constituents:
+  pt =   0.826875, orig. flav =      [g], final flav =      [g]
+
+base jet 25: pt=0.816938 rap=2.12442 phi=2.24043, flav = [g]
+IFN jet  25: pt=0.816938 rap=2.12442 phi=2.24043, flav = [g]
+constituents:
+  pt =   0.816938, orig. flav =      [g], final flav =      [g]
+
+base jet 26: pt=0.766619 rap=-1.35887 phi=4.55501, flav = [t ]
+IFN jet  26: pt=0.766619 rap=-1.35887 phi=4.55501, flav = [t ]
+constituents:
+  pt =   0.438108, orig. flav =     [t ], final flav =     [t ]
+  pt =   0.332392, orig. flav =      [g], final flav =      [g]
+
+base jet 27: pt=0.766349 rap=-3.28078 phi=3.72099, flav = [sbar ]
+IFN jet  27: pt=0.766349 rap=-3.28078 phi=3.72099, flav = [sbar ]
+constituents:
+  pt =   0.766349, orig. flav =  [sbar ], final flav =  [sbar ]
+
+base jet 28: pt=0.70842 rap=-1.08317 phi=4.24765, flav = [dbar ]
+IFN jet  28: pt=0.70842 rap=-1.08317 phi=4.24765, flav = [g]
+constituents:
+  pt =    0.70842, orig. flav =  [dbar ], final flav =      [g]
+
+base jet 29: pt=0.694449 rap=-1.18419 phi=2.49964, flav = [g]
+IFN jet  29: pt=0.694449 rap=-1.18419 phi=2.49964, flav = [g]
+constituents:
+  pt =   0.581701, orig. flav =      [g], final flav =      [g]
+  pt =   0.117691, orig. flav =      [g], final flav =      [g]
+
+base jet 30: pt=0.693864 rap=2.74422 phi=1.60533, flav = [g]
+IFN jet  30: pt=0.693864 rap=2.74422 phi=1.60533, flav = [g]
+constituents:
+  pt =   0.693864, orig. flav =      [g], final flav =      [g]
+
+base jet 31: pt=0.693266 rap=0.908004 phi=3.67408, flav = [c ]
+IFN jet  31: pt=0.693266 rap=0.908004 phi=3.67408, flav = [c ]
+constituents:
+  pt =   0.693266, orig. flav =     [c ], final flav =     [c ]
+
+base jet 32: pt=0.6169 rap=-2.53755 phi=3.33819, flav = [g]
+IFN jet  32: pt=0.6169 rap=-2.53755 phi=3.33819, flav = [g]
+constituents:
+  pt =     0.6169, orig. flav =      [g], final flav =      [g]
+
+base jet 33: pt=0.5545 rap=1.44401 phi=4.53297, flav = [g]
+IFN jet  33: pt=0.5545 rap=1.44401 phi=4.53297, flav = [g]
+constituents:
+  pt =     0.5545, orig. flav =      [g], final flav =      [g]
+
+base jet 34: pt=0.551647 rap=-6.46023 phi=3.54711, flav = [u ]
+IFN jet  34: pt=0.551647 rap=-6.46023 phi=3.54711, flav = [u ]
+constituents:
+  pt =   0.551647, orig. flav =     [u ], final flav =     [u ]
+
+base jet 35: pt=0.537698 rap=2.14596 phi=4.69463, flav = [cbar ]
+IFN jet  35: pt=0.537698 rap=2.14596 phi=4.69463, flav = [cbar ]
+constituents:
+  pt =   0.537698, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 36: pt=0.52627 rap=-0.847703 phi=1.80341, flav = [g]
+IFN jet  36: pt=0.52627 rap=-0.847703 phi=1.80341, flav = [g]
+constituents:
+  pt =   0.354366, orig. flav =      [g], final flav =      [g]
+  pt =   0.172672, orig. flav =      [g], final flav =      [g]
+
+base jet 37: pt=0.493958 rap=4.44654 phi=4.38025, flav = [u ]
+IFN jet  37: pt=0.493958 rap=4.44654 phi=4.38025, flav = [u ]
+constituents:
+  pt =   0.493958, orig. flav =     [u ], final flav =     [u ]
+
+base jet 38: pt=0.473269 rap=-1.08771 phi=3.03462, flav = [d ]
+IFN jet  38: pt=0.473269 rap=-1.08771 phi=3.03462, flav = [g]
+constituents:
+  pt =   0.473269, orig. flav =     [d ], final flav =      [g]
+
+base jet 39: pt=0.451606 rap=1.48924 phi=5.63162, flav = [u ]
+IFN jet  39: pt=0.451606 rap=1.48924 phi=5.63162, flav = [u ]
+constituents:
+  pt =   0.451606, orig. flav =     [u ], final flav =     [u ]
+
+base jet 40: pt=0.444205 rap=2.39205 phi=3.23499, flav = [cbar ]
+IFN jet  40: pt=0.444205 rap=2.39205 phi=3.23499, flav = [cbar ]
+constituents:
+  pt =   0.444205, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 41: pt=0.433439 rap=-3.2787 phi=5.1718, flav = [g]
+IFN jet  41: pt=0.433439 rap=-3.2787 phi=5.1718, flav = [g]
+constituents:
+  pt =   0.433439, orig. flav =      [g], final flav =      [g]
+
+base jet 42: pt=0.385991 rap=3.60074 phi=5.50009, flav = [dbar b ]
+IFN jet  42: pt=0.385991 rap=3.60074 phi=5.50009, flav = [dbar b ]
+constituents:
+  pt =   0.307448, orig. flav =     [b ], final flav =     [b ]
+  pt =  0.0789851, orig. flav =  [dbar ], final flav =  [dbar ]
+
+base jet 43: pt=0.303439 rap=0.859124 phi=2.02855, flav = [s ]
+IFN jet  43: pt=0.303439 rap=0.859124 phi=2.02855, flav = [s ]
+constituents:
+  pt =   0.303439, orig. flav =     [s ], final flav =     [s ]
+
+base jet 44: pt=0.303365 rap=0.0119964 phi=2.88992, flav = [dbar ]
+IFN jet  44: pt=0.303365 rap=0.0119964 phi=2.88992, flav = [g]
+constituents:
+  pt =   0.303365, orig. flav =  [dbar ], final flav =      [g]
+
+base jet 45: pt=0.294963 rap=-0.0219949 phi=0.145883, flav = [t ]
+IFN jet  45: pt=0.294963 rap=-0.0219949 phi=0.145883, flav = [t ]
+constituents:
+  pt =   0.282389, orig. flav =     [t ], final flav =     [t ]
+  pt =  0.0125743, orig. flav =      [g], final flav =      [g]
+
+base jet 46: pt=0.276345 rap=-1.04361 phi=0.382641, flav = [u ]
+IFN jet  46: pt=0.276345 rap=-1.04361 phi=0.382641, flav = [g]
+constituents:
+  pt =   0.276345, orig. flav =     [u ], final flav =      [g]
+
+base jet 47: pt=0.265727 rap=-2.20735 phi=5.83133, flav = [g]
+IFN jet  47: pt=0.265727 rap=-2.20735 phi=5.83133, flav = [g]
+constituents:
+  pt =   0.265727, orig. flav =      [g], final flav =      [g]
+
+base jet 48: pt=0.263552 rap=-0.85791 phi=1.10944, flav = [g]
+IFN jet  48: pt=0.263552 rap=-0.85791 phi=1.10944, flav = [g]
+constituents:
+  pt =   0.263552, orig. flav =      [g], final flav =      [g]
+
+base jet 49: pt=0.233553 rap=3.88086 phi=6.06142, flav = [cbar ]
+IFN jet  49: pt=0.233553 rap=3.88086 phi=6.06142, flav = [cbar ]
+constituents:
+  pt =   0.233553, orig. flav =  [cbar ], final flav =  [cbar ]
+
+base jet 50: pt=0.17563 rap=1.84172 phi=3.71244, flav = [sbar ]
+IFN jet  50: pt=0.17563 rap=1.84172 phi=3.71244, flav = [g]
+constituents:
+  pt =    0.17563, orig. flav =  [sbar ], final flav =      [g]
Index: contrib/contribs/IFNPlugin/trunk/include/fastjet/contrib/FlavInfo.hh
===================================================================
--- contrib/contribs/IFNPlugin/trunk/include/fastjet/contrib/FlavInfo.hh	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/include/fastjet/contrib/FlavInfo.hh	(revision 1447)
@@ -0,0 +1,375 @@
+// Copyright (c) 2023, Fabrizio Caola, Radoslaw Grabarczyk,
+// Maxwell Hutt, Gavin P. Salam, Ludovic Scyboz, and Jesse Thaler
+
+#ifndef __FJCONTRIB_FLAVINFO_HH__
+#define __FJCONTRIB_FLAVINFO_HH__
+
+#ifdef __FJC_FLAVINFO_USEFJCORE__
+#define fastjet fjcore
+#include "fjcore_local.hh"
+#define FASTJET_BEGIN_NAMESPACE namespace fjcore {
+#define FASTJET_OVERRIDE override
+#define FASTJET_END_NAMESPACE }
+#else
+#include "fastjet/JetDefinition.hh"
+//#include "fastjet/LimitedWarning.hh"
+//#include "fastjet/ClusterSequence.hh"
+//#include "fastjet/SharedPtr.hh"
+#endif
+
+
+#include <iostream>
+
+//using namespace std;
+
+FASTJET_BEGIN_NAMESPACE      // defined in fastjet/internal/base.hh
+namespace contrib{
+//----------------------------------------------------------------------
+/// class to allow representation of flavour, including concepts
+/// such as the fact that a particle is an incoming "beam", or
+/// should be a "spectator" during the clustering.
+///
+/// The class also provides a facility to interpret PDG codes
+/// and deduce the corresponding flavour content of the particle.
+///
+/// For jet clustering with IFN algorithms, it is often easier
+/// to use the FlavHistory class, which is given below
+class FlavInfo : public PseudoJet::UserInfoBase {
+
+public:
+  /// constructs a flavour info from a pdg code. This can handle most
+  /// standard model codes without difficulty. A zero code produces a flavourless object.
+  ///
+  /// The flags argument is optional, and can be set either to
+  /// FlavInfo::beam or FlavInfo::spectator
+  ///
+  FlavInfo (int pdg_code = 0, int flags = 0);
+  /// constructs a flavour info object from the individual flavours
+  FlavInfo (int n_d, int n_u, int n_s, int n_c, int n_b, int n_t, int flags = 0);
+
+  /// apply modulo 2 to all flavours, for hadronic info
+  void apply_modulo_2();
+
+  /// apply any abs to all flavours (so any non-zero number becomes 1)
+  void apply_any_abs();
+
+  /// returns the net number of quarks of flavour iflv
+  /// (iflv runs from 1=d to 6=top).
+  int operator[](int iflv) const {return _flav_content[iflv];}
+
+  /// sets the number of objects of flavour iflv (1=d to 6=top) to be n
+  void set_flav(int iflv, int n) {_flav_content[iflv] = n; update_flavourless_attribute();}
+
+  /// allows comparison of flavours
+  bool operator==(const FlavInfo &) const;
+  bool operator!=(const FlavInfo &) const;
+
+  /// resets all flavours to zero except iflv; this should be called,
+  /// for example, when considering b-flavour at hadron level, so that
+  /// the algorithm doesn't get confused by the many other quark
+  /// flavours that are around (and also because, experimentally,
+  /// those other flavours may not be well known).
+  void reset_all_but_flav(int iflv);
+
+  /// returns the pdg_code, or 0 if it's unknown (e.g. due to result
+  /// of recombination)
+  int pdg_code() const {return _pdg_code;}
+
+  /// label this particle as being an incoming beam particle
+  void label_as_beam() {_flav_content[0] |= beam;}
+  /// returns true if this particle is a beam particle.
+  bool is_beam() const {return (_flav_content[0] & beam);}
+
+  /// label this object as being a "spectator", such as a W, which is
+  /// relevant for calculating the beam distance in flavour clusterings
+  /// but does itself take part in the clustering
+  void label_as_spectator() {_flav_content[0] |= spectator;}
+  /// returns true if this particle is a spectator.
+  bool is_spectator() const {return (_flav_content[0] & spectator);}
+
+  /// returns true if the object has no net flavour
+  bool is_flavourless() const {return (_flav_content[0] & _is_flavourless);}
+  bool is_flavorless() const {return is_flavourless();}
+
+  /// returns true if the object has more than one unit of flavour
+  bool is_multiflavoured() const;
+  bool is_multiflavored() const {return is_multiflavoured();}
+
+  /// returns true if the particle has associated FlavInfo and if there
+  /// exists a flavour for which (*this) and the particle have
+  /// positive/negative (or vice versa) net amounts of that flavour. 
+  ///
+  /// BEWARE: do not use this to check if the flavours cancel. 
+  /// Instead add the flavours and check that the result is flavourless
+  bool has_opposite_flavour(const PseudoJet & particle) const;
+  bool has_opposite_flavor(const PseudoJet & particle) const {return has_opposite_flavour(particle);}
+
+  /// allows addition of flavour: note that beam, spectator and PDG status are lost
+  FlavInfo operator+(const FlavInfo &) const;
+  /// allows subtraction of flavour: note that beam, spectator and PDG status are lost
+  FlavInfo operator-(const FlavInfo &) const;
+
+  /// returns a string such as "u d", "cbar", etc.; "g" means gluon or anything
+  /// else with no flavour
+  std::string description() const;
+
+  /// returns the flavour of a particle if that particle has flavour, otherwise
+  /// just the default flavour
+  static const FlavInfo & flavour_of(const PseudoJet & particle);
+  // {
+  //  if (particle.has_user_info<FlavInfo>()) return particle.user_info<FlavInfo>();
+  //  else                                    return _no_flav;
+  //}
+
+  /// value of flag to indicate that the particle is an incoming beam particle
+  static const int beam = 2;
+  /// value of flag to indicate that the particle is a "spectator",
+  /// such as a W, which is relevant for calculating the beam distance
+  /// in flavour clusterings but does itself take part in the
+  /// clustering
+  static const int spectator = 4;
+  int _flav_content[7];
+  void update_flavourless_attribute();
+  static const int _is_flavourless = 1;
+private:
+  int _pdg_code;
+  static const FlavInfo _no_flav;
+
+};
+
+//----------------------------------------------------------------------
+/// Class to keep track of flavour history of a given jet
+///
+class FlavHistory : public PseudoJet::UserInfoBase {
+public:
+  /// Constructor for generic initial history step from a PDG ID code
+  FlavHistory(int initial_flavour_pdg_id) {
+    _flavour_history.push_back(std::make_pair(-1, FlavInfo(initial_flavour_pdg_id)));
+  }
+
+  /// Constructor for generic initial history step from a FlavInfo object
+  FlavHistory(const FlavInfo & initial_flavour) {
+    _flavour_history.push_back(std::make_pair(-1, initial_flavour));
+  }
+
+  /// Constructor for known initial history step from a FlavInfo object
+  FlavHistory(const FlavInfo & initial_flavour, 
+              const int initial_hist_step) {
+    _flavour_history.push_back(std::make_pair(initial_hist_step, initial_flavour));
+  }
+
+  /// returns the current flavour of the particle
+  const FlavInfo & current_flavour() const {return _flavour_history.back().second;}
+  /// returns the initial flavour of the particle
+  const FlavInfo & initial_flavour() const {return _flavour_history.front().second;}
+
+  /// Returns the index of the cluster_sequence history step at which this
+  /// jet acquired its current flavour
+  int current_hist_index() const {return _flavour_history.back().first;}
+
+  /// Returns the index of the cluster_sequence history step at which this
+  /// jet was created with its initial flavour
+  int initial_hist_index() const {return _flavour_history.front().first;}
+
+
+
+
+
+  /// Apply flavour modulo 2 to all elements of the history
+  void apply_modulo_2() {
+    for (unsigned i = 0; i < _flavour_history.size(); i++) {
+      _flavour_history[i].second.apply_modulo_2();
+    }
+  }
+
+  /// Label the most recent history element as a beam particle
+  void label_as_beam() {
+    _flavour_history.back().second.label_as_beam();
+  }
+
+  /// Add element to flavour history of a jet
+  void update_flavour_history(FlavInfo new_flavour, int hist_step) {
+    if (new_flavour != _flavour_history.back().second) {
+      _flavour_history.push_back(std::make_pair(hist_step, new_flavour));
+    }
+  }
+
+  /// Change the last history step of the flavour history. This could
+  /// be used to, e.g., set the initial history step when the constructor
+  /// with history step -1 is used.
+  void amend_last_history_index(int new_hist_step) {
+    _flavour_history.back().first = new_hist_step;
+  }
+
+  /// Return the flavour history vector
+  const std::vector<std::pair<int, FlavInfo>> & history() const {return _flavour_history;}
+
+  /// Return the current (final) flavour element of the history of a PseudoJet.
+  /// For particles with just a FlavInfo, it returns that. 
+  static const FlavInfo & current_flavour_of(const PseudoJet & particle);
+
+  /// Return the final history step of the history of a PseudoJet
+  static const int current_index_of(const PseudoJet &particle);
+
+  /// Return the first flavour element of the history of a PseudoJet
+  /// For particles with just a FlavInfo, it returns just that. 
+  static const FlavInfo & initial_flavour_of(const PseudoJet &jet);
+
+  /// Return the first history step of the history of a PseudoJet
+  static const int initial_index_of(const PseudoJet &jet) {
+    if (jet.has_user_info<FlavHistory>()) {
+      return jet.user_info<FlavHistory>().history()[0].first;
+    } else {
+      throw fastjet::Error(
+          "A particle without FlavHistory was searched for FlavHistory.");
+    }
+  }
+
+  /// Return the flavour at a given history step
+  const FlavInfo & flavour_at_step(int step) const {
+    if (_flavour_history[0].first > step) {
+      throw fastjet::Error(
+          "A particle without FlavHistory was searched for FlavHistory.");
+    }
+    int index_needed = -1;
+    for (unsigned i = 1; i < _flavour_history.size(); i++) {
+      if ((_flavour_history[i].first > step) &&
+          (_flavour_history[i - 1].first <= step))
+        index_needed = i - 1;
+    }
+    if (index_needed == -1) {
+      return _flavour_history.back().second;
+    } else {
+      return _flavour_history[index_needed].second;
+    }
+  }
+
+
+  /// Reset the _flavour_history such that it has one element whose flavour is the initial
+  /// flavour of the jet, and the hist_step is initiated to its initial value.
+  void reset_flavour_history() {
+    std::pair<int, FlavInfo> orig_flavour = _flavour_history[0];
+    std::vector<std::pair<int, FlavInfo>> _new_history;
+    _new_history.push_back(orig_flavour);
+    _flavour_history = _new_history;
+  }
+  const std::vector<std::pair<int, FlavInfo>> & history() {return _flavour_history;}
+
+  // US spelling
+  static const FlavInfo & current_flavor_of(const PseudoJet & particle) {return current_flavour_of(particle);}
+  static const FlavInfo & initial_flavor_of(const PseudoJet & particle) {return initial_flavour_of(particle);}  
+  const FlavInfo & flavor_at_step(int step) const {return flavour_at_step(step);}
+  const FlavInfo & current_flavor() const {return current_flavour();}
+  const FlavInfo & initial_flavor() const {return initial_flavour();}
+
+
+ private:
+  std::vector<std::pair<int, FlavInfo>> _flavour_history;
+};
+
+/// ----------------------------------------------------------------
+/// Class for a flavour recombiner
+class FlavRecombiner : public JetDefinition::DefaultRecombiner {
+public:
+
+  enum FlavSummation {
+    /// net flavour handling, 
+    /// - b        = +1
+    /// - bbar     = -1
+    /// - b + bbar =  0
+    /// - b + b    = +2
+    net, // -> net_flav
+
+    /// flavour is handled modulo 2
+    /// - b        = 1
+    /// - bbar     = 1
+    /// - b + bbar = 0
+    /// - b + b    = 0
+    modulo_2,  // -> mod2_flav
+
+    /// a given flavour is set to 1 if any non-zero number of quarks or anti-quarks is present. 
+    /// So e.g. 
+    /// - b        = 1
+    /// - bbar     = 1
+    /// - b + bbar = 1
+    /// - b + b    = 1
+    any_abs // -> any_flav
+  };
+
+  /// Constructor
+  FlavRecombiner(FlavSummation flav_summation_in = net) : 
+         DefaultRecombiner(), _flav_summation(flav_summation_in) {
+    //assert(flav_summation == net && "handling of non-net flavour summation inside FlavRecombiner is still to come");
+  }
+
+  /// return the flavour summation choice
+  FlavSummation flav_summation() const {return _flav_summation;}
+
+  void preprocess(PseudoJet & p) const FASTJET_OVERRIDE {
+
+    FlavInfo flav;
+    if (p.has_user_info<FlavInfo>()) {
+      flav = p.user_info<FlavInfo>();
+    } else if (p.has_user_info<FlavHistory>()) {
+      /// WARNING: not sure this is right -- depends very much on context
+      /// (e.g. whether reclustering another algorithm's constituents, or clustering
+      /// the flavoured jets that have come out of another algorithm)
+      flav = p.user_info<FlavHistory>().initial_flavour();
+    } else {
+      throw Error("Could not identify FlavInfo or FlavHistory");
+    }
+
+    // make the initial flavour consistent with the summation choice
+    apply_summation_choice(flav);
+    p.set_user_info(new FlavHistory(flav));
+  }
+
+  /// Perform a recombination taking flavour into account
+  void recombine(const PseudoJet &pa,
+                 const PseudoJet &pb,
+                 PseudoJet &pab) const FASTJET_OVERRIDE {
+
+    // Recombine using the default recombiner
+    DefaultRecombiner::recombine(pa, pb, pab);
+
+    // put this condition early on
+    assert(!pab.has_user_info<FlavHistory>());
+
+    // Then, check if the resulting pseudojet is actually flavourless
+    // If it isn't, add flavours. If it is, set it to a gluon
+    FlavInfo flav = FlavHistory::current_flavour_of(pa) + FlavHistory::current_flavour_of(pb);
+
+    // make the flavour consistent with the summation choice
+    apply_summation_choice(flav);
+
+    /// why don't we just do the following?
+    pab.set_user_info(new FlavHistory(flav,pab.cluster_hist_index()));
+
+  }
+
+  // make the flavour consistent with the summation choice
+  void apply_summation_choice(FlavInfo & flav) const {
+
+    if      (_flav_summation == modulo_2) flav.apply_modulo_2();
+    else if (_flav_summation == any_abs) flav.apply_any_abs();
+    else if (_flav_summation != net) throw Error("FlavRecombiner: unknown FlavSummation");
+  }
+
+  /// returns the description of the recombiner
+  std::string description() const FASTJET_OVERRIDE { return DefaultRecombiner::description() + " and " + to_string(_flav_summation) + " flavour recombination "; }
+
+  std::string to_string(FlavSummation flav_summation) const {
+    return (flav_summation == net ? "net_flav" : 
+            flav_summation == modulo_2 ? "mod2_flav" : 
+            flav_summation == any_abs ? "any_flav" : "unknown");
+  }
+
+private:
+  FlavSummation _flav_summation;
+
+};
+
+
+} // namespace contrib
+FASTJET_END_NAMESPACE        // defined in fastjet/internal/base.hh
+#endif // __FJCONTRIB_FLAVINFO_HH__
Index: contrib/contribs/IFNPlugin/trunk/include/fastjet/contrib/FlavNeutraliser.hh
===================================================================
--- contrib/contribs/IFNPlugin/trunk/include/fastjet/contrib/FlavNeutraliser.hh	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/include/fastjet/contrib/FlavNeutraliser.hh	(revision 1447)
@@ -0,0 +1,172 @@
+#ifndef __FJCONTRIB_FLAVNEUTRALISER_HH__
+#define __FJCONTRIB_FLAVNEUTRALISER_HH__
+
+#include "fastjet/contrib/FlavInfo.hh"
+
+FASTJET_BEGIN_NAMESPACE      // defined in fastjet/internal/base.hh
+namespace contrib{
+
+// ----------------------------------------------------------------------
+/// Compare the net flavour of two vector<fastjet::PseudoJet> objects.
+bool jet_net_flavour_compare(std::vector<fastjet::PseudoJet> & j, std::vector<fastjet::PseudoJet> & k);
+
+/// Compare the flavour of each jet of two vector<fastjet::PseudoJet> objects.
+/// If either vector has >3 jets, only the 3 hardest (i.e. largest energy) jets
+/// are compared.
+bool jet_flavour_compare(const std::vector<fastjet::PseudoJet> & j, const std::vector<fastjet::PseudoJet> & k, 
+                        const int max_jets=-1, bool sort_by_px = false);
+
+
+/// ----------------------------------------------------------------
+/// Class for the new flavour neutraliser
+class FlavNeutraliser {
+public:
+  enum measure { sinh_delta_R, delta_R, jade_delta_R, maxscale_delta_R, phi2_coshy, cosphi_coshy,
+                 aktlike_pair_refratio, aktlike_pair_dynrefratio, 
+                 jade, jadea2, maxscale, general };
+
+  /// Main constructor for the FlavNeutraliser class.
+  FlavNeutraliser(bool modulo_2,
+                  measure measure_in,
+                  bool use_mass_flav = false,
+                  bool spherical_algo = false,
+                  double pp = 1.0,
+                  bool recursive_neutralisation = true) :
+                  _modulo_2(modulo_2), _measure(measure_in), _use_mass_flav(use_mass_flav),
+                  _spherical_algo(spherical_algo), _pp(pp), _recursive(recursive_neutralisation)
+                  {}
+
+  /// A constructor for the FlavNeutraliser class for 
+  /// the general measure of the form:
+  ///
+  ///   u_ij = max( pti^2 , ptj^2 )^p min( pti^2 , ptj^2 )^q 
+  ///          x 2[ 1/a^2 (cosh(a*Δy_ij) - 1) + (cos(Δφ_ij) - 1) ]
+  FlavNeutraliser(double p, double q, double a,
+                  bool modulo_2,
+                  measure measure_in = general,
+                  bool use_mass_flav = false,
+                  bool spherical_algo = false,
+                  double pp = 1.0,
+                  bool recursive_neutralisation = true) :
+                  _p(p), _q(q), _a(a), _modulo_2(modulo_2), _measure(measure_in), 
+                  _use_mass_flav(use_mass_flav), _spherical_algo(spherical_algo), 
+                  _pp(pp), _recursive(recursive_neutralisation)
+                  {}
+
+  void set_recursive(bool val) {_recursive = val;}
+  bool recursive() const {return _recursive;}
+
+  /// @brief Returns the neutralisation distance (u12) between the
+  ///        two input jets
+  /// @param p1 input pseudojet 1
+  /// @param p2 input pseudojet 1
+  /// @param ref_scale reference scale for distance measures that need such a scale
+  /// @return u12
+  double neutralisation_distance(const PseudoJet &p1, 
+                                 const PseudoJet &p2, double ref_scale) const;
+
+  /// Uses the ClusterSequence to build up neutralisation and returns a
+  /// flavour-neutralised vector<PseudoJet> that is intended to replace
+  /// cs.jets() (which contains the whole clustering history).
+  std::vector<PseudoJet> neutralise(ClusterSequence &cs) const;
+
+  /// returns the inclusive jets as obtained after flavour
+  /// neutralisation (i.e. with the neutralise function).
+  std::vector<PseudoJet> inclusive_jets(ClusterSequence &cs,
+                                   const double ptmin = 0.0) const {
+    const std::vector<ClusterSequence::history_element> & hist = cs.history();
+    std::vector<PseudoJet> jets = neutralise(cs);
+    std::vector<PseudoJet> jets_local;
+    int u = int(hist.size()) - 1;
+    while (u >= 0) {
+      if (hist[u].parent2 == ClusterSequence::BeamJet) {
+        int parent1 = hist[u].parent1;
+        const PseudoJet & jet = jets[hist[parent1].jetp_index];
+        if (jet.pt() >= ptmin) {jets_local.push_back(jet);}
+      }
+      u--;
+    }
+    return jets_local;
+  }
+
+  void use_neutralisation_candidates(
+    PseudoJet & jet_i,
+    double uij,
+    int ih_step,
+    std::vector<std::pair<PseudoJet*, double>> & flavour_candidates,
+    double ref_scale) const;
+
+  void use_neutralisation_candidates_recursive(
+    PseudoJet & jet_i,
+    double uij,
+    int ih_step,
+    std::vector<std::pair<PseudoJet*, double>> & flavour_candidates,
+    double ref_scale,
+    const PseudoJet * exclude = nullptr
+    ) const;
+
+  /// @brief  return a value for the jet's rapidity
+  ///         that is FJ's default except at small rapidity
+  ///         where a more accurate formula is used, allowing
+  ///         representations of rapidities down to the 
+  ///         numeric_limits<double>::min()
+  ///
+  /// @param p the input jet
+  /// @return the input jet's rapidity
+  static double accurate_rap(const PseudoJet & p) {
+    double rap = p.rap();
+
+    // switch to accurate rap if the momentum has moderately small
+    // rapidity
+    constexpr double rap_transition = 0.1;
+    if (std::fabs(rap) < rap_transition) rap = 0.5 * log1p(2*p.pz()/(p.E() - p.pz()));
+    return rap;
+  }
+
+  /// @brief  return a value for the absdphi between p1 and p2
+  /// @param p1 input jet 1
+  /// @param p2 input jet 2
+  /// @return abs(dphi_{12})
+  ///
+  /// the result is FJ's default, except at small dphi values, where a 
+  /// more accurate calculation is used based on a transverse cross
+  /// product, which is more accurate in particular when both momenta
+  /// are close to either the x or y axis
+  static double accurate_absdphi(const PseudoJet & p1, const PseudoJet & p2) {
+    double dphi = std::fabs(p1.delta_phi_to(p2));
+    constexpr double phi_transition = 0.1;
+    if (dphi < phi_transition) {
+      // use a more accurate calculation based on a transverse cross product;
+      // organise the cross product so as to avoid excessively large or small
+      // numbers appearing in intermediate stages
+      double invp1pt = 1.0/p1.pt();
+      double invp2pt = 1.0/p2.pt();
+      double cross = (p1.px()*invp1pt) * (p2.py()*invp2pt) - (p2.px()*invp2pt) * (p1.py()*invp1pt);
+      //double cross = (p1.px() * p2.py() - p2.px() * p1.py())/sqrt(p1.pt2() * p2.pt2());
+      assert(cross <= 1.0 && cross >= -1.0);
+      dphi = std::fabs(asin(cross));
+    }
+    return dphi;
+  }
+
+private:
+  /// the value of deltaR2 below which we replace 2*(cosh-cos) with
+  /// (addition as of 2021-09-26, but not yet being used)
+  double _p, _q, _a;
+  static const double _deltaR2_handover;
+  bool    _modulo_2;
+  measure _measure;
+  bool    _use_mass_flav;
+  bool    _spherical_algo;
+  double  _pp;
+  bool    _recursive;
+
+  bool    _writeout_uijs = false;
+
+
+};
+
+} // namespace contrib
+
+FASTJET_END_NAMESPACE        // defined in fastjet/internal/base.hh
+#endif // __FJCONTRIB_FLAVNEUTRALISER_HH__
Index: contrib/contribs/IFNPlugin/trunk/include/fastjet/contrib/IFNPlugin.hh
===================================================================
--- contrib/contribs/IFNPlugin/trunk/include/fastjet/contrib/IFNPlugin.hh	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/include/fastjet/contrib/IFNPlugin.hh	(revision 1447)
@@ -0,0 +1,162 @@
+#ifndef __FJCONTRIB_IFNPLUGIN_HH__
+#define __FJCONTRIB_IFNPLUGIN_HH__
+
+// #ifdef __FJC_FLAVNEUT_USEFJCORE__
+// #include "fjcore.hh"
+// #define FASTJET_BEGIN_NAMESPACE "namespace fastjet {"
+// #define FASTJET_END_NAMESPACE   "}"
+// #else 
+// #include "fastjet/JetDefinition.hh"
+// #define precision_type double
+// #endif 
+
+#include "fastjet/contrib/FlavNeutraliser.hh"
+
+FASTJET_BEGIN_NAMESPACE      // defined in fastjet/internal/base.hh
+namespace contrib{
+
+/// Plugin that runs a specified jet algorithm in conjunction
+/// with Flavour Neutralisation
+class IFNPlugin : public JetDefinition::Plugin {
+public:
+
+ /// Main constructor for a IFNPlugin
+ ///
+ /// \param jet_def: the jet definition on which this plugin will be based
+ /// \param alpha: the parameter alpha in the uij neutralisation measure
+ /// \param omega: the parameter omega in the uij neutralisation measure (<=0 defaults to
+ ///               3 - alpha as used in the paper); relevant only for pp algorithms
+ /// \param flav_summation: the flavour summation method to be used (should be one of 
+ ///        FlavRecombiner::net and FlavRecombiner::modulo_2)
+ /// \param use_mass_flav: intended for IRC tests when dealing with large rapidities
+ IFNPlugin(
+    const JetDefinition & jet_def,
+    double alpha,                  
+    double omega = -1,
+    FlavRecombiner::FlavSummation flav_summation = FlavRecombiner::net, 
+    bool use_mass_flav = false
+ ) :  _jet_def(jet_def), 
+      _p(0.5*alpha), 
+      _q(0.5*(2-alpha)), 
+      _a(omega > 0 ? omega : 3 - alpha),
+      _modulo_2(flav_summation == FlavRecombiner::modulo_2),
+      _measure_in(FlavNeutraliser::general), 
+      _use_mass_flav(use_mass_flav),
+      _spherical_algo(_jet_def.is_spherical()),
+       _pp(1), // dummy value
+      _recursive(true) {
+        if (flav_summation == FlavRecombiner::any_abs) {
+          throw Error("IFNPlugin: FlavRecombiner::any_abs is not supported");
+          }
+          check_mod2_consistency();
+      }
+
+ /// Old main constructor for the class. Intended only for developers.
+ ///
+ /// \param jet_def: the jet definition on which this plugin will be based
+ /// \param modulo_2: if true, flavour should be treated modulo 2
+ /// \param measure_in: the distance measure to be used in the neutralisation
+ /// \param use_mass_flav: only intended for tests
+ /// \param pp: in [old, pre-release] e+e- alg we use (Emax^2/Emin^2)^pp
+ /// \param recursive_neutralisation: if true (default), use recursive algo
+ IFNPlugin(
+     JetDefinition jet_def,
+     bool modulo_2,
+     FlavNeutraliser::measure measure_in,
+     bool use_mass_flav = false,
+     double pp = 1,
+     bool recursive_neutralisation = true)
+     : _jet_def(jet_def),
+       _modulo_2(modulo_2),
+       _measure_in(measure_in),
+       _use_mass_flav(use_mass_flav),
+       _spherical_algo(_jet_def.is_spherical()),
+       _pp(pp),
+       _recursive(recursive_neutralisation) {check_mod2_consistency();}
+         
+
+
+ /// Alternative constructor for the class that allows
+ /// defining the neutraliser measure with general p, q and a
+ /// according to
+ ///   u_ij = max( pti^2 , ptj^2 )^p min( pti^2 , ptj^2 )^q 
+ ///          x 2[ 1/a^2 (cosh(a*Δy_ij) - 1) + (cos(Δφ_ij) - 1) ]
+ /// \param jet_def: the jet definition on which this plugin will be based
+ /// \param p: p parameter in the definition above
+ /// \param q: q parameter in the definition above
+ /// \param a: a parameter in the definition above
+ /// \param modulo_2: if true, flavour should be treated modulo 2
+ /// \param measure_in: the distance measure to be used in the neutralisation
+ /// \param use_mass_flav: only intended for tests
+ /// \param pp: in e+e- alg we use (Emax^2/Emin^2)^pp (default = 1)
+ /// \param recursive_neutralisation: if true (default), use recursive algo
+ IFNPlugin(
+     JetDefinition jet_def,
+     double p, double q, double a,
+     bool modulo_2 = false,
+     FlavNeutraliser::measure measure_in = FlavNeutraliser::general,
+     bool use_mass_flav = false,
+     double pp = 1,
+     bool recursive_neutralisation = true)
+     : _jet_def(jet_def), 
+       _p(p), _q(q), _a(a),
+       _modulo_2(modulo_2),
+       _measure_in(measure_in),
+       _use_mass_flav(use_mass_flav),
+       _spherical_algo(_jet_def.is_spherical()),
+       _pp(pp),
+       _recursive(recursive_neutralisation)
+        {check_mod2_consistency();}
+
+ typedef FlavNeutraliser::measure Measure;
+
+ void set_recursive(bool val) {_recursive = val;}
+ bool recursive() const {return _recursive;}
+
+ void set_measure(FlavNeutraliser::measure measure) {_measure_in = measure;}
+ FlavNeutraliser::measure measure() const {return _measure_in;}
+
+ // Jet radius
+ double R() const FASTJET_OVERRIDE { return _jet_def.R(); }
+
+ // Required by base class:
+ std::string description() const FASTJET_OVERRIDE;
+
+ void run_clustering(ClusterSequence &) const FASTJET_OVERRIDE;
+
+ bool is_spherical() const FASTJET_OVERRIDE {return _spherical_algo;}
+
+private:
+
+  /// checks that the mod2 setting is consistent with the base
+  /// algorithm's flavour recombiner, if it has one
+  void check_mod2_consistency() const;
+
+  /// the base jet definition
+  JetDefinition _jet_def;
+
+  /// the general form of the uij distance measure is max(pti^2, ptj^2)^p min(pti^2, ptj^2)^q Omega_ij
+  double _p;
+  double _q;
+
+  /// the internal variable that stores what is known as omega in the paper
+  double _a;
+
+  // whether modulo 2 should be used
+  bool _modulo_2;
+  FlavNeutraliser::measure _measure_in;
+  bool _use_mass_flav;
+  bool _spherical_algo;
+  double _pp;
+  bool _recursive;
+};
+
+// a typedef for backward compatibility
+typedef IFNPlugin FlavNeutraliserPlugin;
+
+} // namespace contrib
+
+
+FASTJET_END_NAMESPACE
+
+#endif // __FJCONTRIB_IFNPLUGIN_HH__
Index: contrib/contribs/IFNPlugin/trunk/include/fastjet/contrib/MassFlav.hh
===================================================================
--- contrib/contribs/IFNPlugin/trunk/include/fastjet/contrib/MassFlav.hh	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/include/fastjet/contrib/MassFlav.hh	(revision 1447)
@@ -0,0 +1,138 @@
+///
+/// \file MassFlav.hh
+///
+/// This file is mainly intended for IRC tests of the IFNPlugin
+#ifndef __FJCONTRIB_MASSFLAV_HH__
+#define __FJCONTRIB_MASSFLAV_HH__
+
+#ifdef __FJC_FLAVINFO_USEFJCORE__
+#include "FlavInfo.hh"
+#else
+#include "fastjet/PseudoJet.hh"
+#include "fastjet/JetDefinition.hh"
+#include "fastjet/contrib/FlavNeutraliser.hh"
+#endif
+
+#include <limits>
+///
+///
+
+FASTJET_BEGIN_NAMESPACE  // defined in fastjet/internal/base.hh
+namespace contrib{
+
+  //class MassFlavHistory : public FlavInfo {
+  class MassFlavHistory : public FlavHistory {
+   public:
+    // MassFlavHistory(FlavInfo flavinfo, double m_in = 0.0) : FlavInfo(flavinfo),
+    // _m(m_in) {}
+    MassFlavHistory(FlavHistory flavhist, double m_in = 0.0)
+        : FlavHistory(flavhist), _m(m_in) {}
+    void set_mass(double m_in) { _m = m_in; }
+    double mass() const { return _m; }
+
+   private:
+    double _m;
+  };
+
+  class MassFlavRecombiner : public FlavRecombiner {
+   public:
+    MassFlavRecombiner() : FlavRecombiner() {}
+
+    MassFlavRecombiner(const FlavRecombiner & flav_reco) : FlavRecombiner(flav_reco) {}
+
+
+    /// Perform a recombination taking flavour into account
+    /// as well as the known mass of the particles, so
+    /// as to be able to correctly reconstruct the rapidity
+    /// of the newly formed particle, even when pa and pb
+    /// are at quite extreme rapidities.
+    void recombine(const PseudoJet &pa, const PseudoJet &pb,
+                   PseudoJet &pab) const {
+
+      // old code for the case eta_a << 0, eta_b >> 0
+      // not sure whether it's actually needed
+
+      //PseudoJet pab_tilde;
+      //FlavRecombiner::recombine(pa, pb, pab_tilde);
+
+      //double pab_m2 = ma*ma + mb*mb + 2*dot_product(pa,pb);
+
+      //// and set the correct rapidity
+      //double rap = 0.5*log((max(0.0,pab_m2)+pab_tilde.kt2())/
+      //                      pow(pab_tilde.E() + fabs(pab_tilde.pz()),2));
+      //if (pab_tilde.pz() > 0) rap = -rap;
+
+      //pab = PtYPhiM(pab_tilde.pt(), rap, pab_tilde.phi(), sqrt(pab_m2));
+      //pab.set_user_info(new MassFlavHistory(pab_tilde.user_info<FlavHistory>(),
+      //                  sqrt(pab_m2)));
+
+      // special treatment if both rapidities are small, or if one
+      // is small and it looks like the other will be small too
+      constexpr double rap_lim = 0.1;
+
+      // if both particles (or one particle and its result) are at
+      // small rapidity, just use 4-vector sum, which preserves
+      // accurate small x,y,z components more reliably
+      bool pa_small_rap = std::fabs(pa.rap()) < rap_lim;
+      bool pb_small_rap = std::fabs(pb.rap()) < rap_lim;
+      double pab_approx_rap = (pa.pt()*pa.rap() + pb.pt()*pb.rap())/(pa.pt()+pb.pt());
+      bool pab_small_rap = std::fabs(pab_approx_rap) < rap_lim;
+      int n_small_rap = int(pa_small_rap ) + int(pb_small_rap) + int(pab_small_rap);
+      // at least two of the above at small rapidity: revert to 4-vector sum
+      if (n_small_rap >= 2) {
+        // open question as to what we do about the mass here...
+        // (i.e. we could try to make it more accurate, but will not for now)
+        FlavRecombiner::recombine(pa, pb, pab);
+        pab.set_user_info(new MassFlavHistory(pab.user_info<FlavHistory>(),
+                                           pab.m()));
+        return;
+      }
+
+      double ma = mass_of_particle(pa);
+      double mb = mass_of_particle(pb);
+
+      double avrap = (pa.rap() + pb.rap()) / 2;
+
+      PseudoJet shifted_pa = PtYPhiM(pa.pt(), pa.rap() - avrap, pa.phi(), ma);
+      PseudoJet shifted_pb = PtYPhiM(pb.pt(), pb.rap() - avrap, pb.phi(), mb);
+
+      shifted_pa.set_user_info(
+          new MassFlavHistory(pa.user_info<FlavHistory>(), ma));
+      shifted_pb.set_user_info(
+          new MassFlavHistory(pb.user_info<FlavHistory>(), mb));
+
+      PseudoJet shifted_pab;
+
+      // Recombine using the default recombiner
+      FlavRecombiner::recombine(shifted_pa, shifted_pb, shifted_pab);
+
+      pab = PtYPhiM(shifted_pab.pt(), shifted_pab.rap() + avrap,
+                    shifted_pab.phi(), shifted_pab.m());
+      pab.set_user_info(new MassFlavHistory(shifted_pab.user_info<FlavHistory>(),
+                                        shifted_pab.m()));
+    }
+
+    double mass_of_particle(const PseudoJet &p) const {
+      if (p.has_user_info<MassFlavHistory>())
+        return p.user_info<MassFlavHistory>().mass();
+      // otherwise we expect the mass to be zero to within rounding errors
+      // so check this
+      double m2 = p.m2();
+      const double safety_factor = 10.0;
+      if (std::fabs(m2) > safety_factor *
+                              std::numeric_limits<double>::epsilon() *
+                              pow(p.E(), 2)) {
+        throw Error(
+            "MassFlavRecombiner found particle without MassFlavHistory, whose "
+            "mass is inconsistent with zero");
+      }
+      // if things are OK, then just return zero.
+      return 0.0;
+    }
+  };
+
+} // namespace contrib
+
+FASTJET_END_NAMESPACE  // defined in fastjet/internal/base.hh
+
+#endif // __FJCONTRIB_MASSFLAV_HH__
Index: contrib/contribs/IFNPlugin/trunk/AUTHORS
===================================================================
--- contrib/contribs/IFNPlugin/trunk/AUTHORS	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/AUTHORS	(revision 1447)
@@ -0,0 +1,5 @@
+This contrib brings together the work of several groups:
+
+- The flavour infrastructure and IFNPlugin code has been provided by
+  Fabrizio Caola, Radoslaw Grabarczyk, Maxwell Hutt, Gavin P. Salam,
+  Ludovic Scyboz, and Jesse Thaler
\ No newline at end of file
Index: contrib/contribs/IFNPlugin/trunk/ChangeLog
===================================================================
--- contrib/contribs/IFNPlugin/trunk/ChangeLog	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/ChangeLog	(revision 1447)
@@ -0,0 +1,8 @@
+2024-03-19 Gavin:
+	* [many files]:
+	Initial creation and import of IFNPlugin version 1.0.1 from 
+	git@github.com:jetflav/IFNPlugin.git (7673166d9dc)
+
+
+
+
Index: contrib/contribs/IFNPlugin/trunk/COPYING
===================================================================
--- contrib/contribs/IFNPlugin/trunk/COPYING	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/COPYING	(revision 1447)
@@ -0,0 +1,685 @@
+The JetFlav code is released under the terms of the GNU General Public
+License v3 or (at your option) any later version. 
+
+Please also respect the MCnet academic usage guidelines,
+see <https://www.montecarlonet.org/publications_guidelines/> for details.
+
+
+--------------------------------------------------------------------------
+
+
+
+                    GNU GENERAL PUBLIC LICENSE
+                      Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program 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 3 of the License, or
+    (at your option) any later version.
+
+    This program 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 program.  If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
\ No newline at end of file
Index: contrib/contribs/IFNPlugin/trunk/FlavInfo.cc
===================================================================
--- contrib/contribs/IFNPlugin/trunk/FlavInfo.cc	(revision 0)
+++ contrib/contribs/IFNPlugin/trunk/FlavInfo.cc	(revision 1447)
@@ -0,0 +1,245 @@
+// Copyright (c) 2023, Fabrizio Caola, Radoslaw Grabarczyk,
+// Maxwell Hutt, Gavin P. Salam, Ludovic Scyboz, and Jesse Thaler
+
+#include "fastjet/contrib/FlavInfo.hh"
+#include <sstream>
+
+#ifndef __FJC_FLAVINFO_USEFJCORE__
+#include "fastjet/ClusterSequence.hh"
+#include "fastjet/SharedPtr.hh"
+#endif
+
+using namespace std;
+
+FASTJET_BEGIN_NAMESPACE      // defined in fastjet/internal/base.hh
+namespace contrib{
+
+//----------------------------------------------------------------------
+FlavInfo::FlavInfo(int n_d, int n_u, int n_s, int n_c, int n_b, int n_t, int flags) :
+  _pdg_code(0) {
+  _flav_content[0] = flags;
+  _flav_content[1] = n_d;
+  _flav_content[2] = n_u;
+  _flav_content[3] = n_s;
+  _flav_content[4] = n_c;
+  _flav_content[5] = n_b;
+  _flav_content[6] = n_t;
+  update_flavourless_attribute();
+}
+
+//----------------------------------------------------------------------
+FlavInfo::FlavInfo(int pdg_code, int flags) : _pdg_code(pdg_code){
+  _flav_content[0] = flags;
+  for(unsigned i = 1; i <= 6; i++) _flav_content[i] = 0;
+
+  // for particles with illicit (zero) pdg_code, no work to be done
+  if (_pdg_code == 0) return;
+
+  int netsign = (pdg_code >= 0 ? +1 : -1);
+  pdg_code = abs(pdg_code);
+
+  // extract digits of the pdg_code, since these contain information
+  // on flavour of component quarks
+  valarray<int> digit(4);
+  int           ndigits = 0;
+  for (int i = 0; i < 4; i++) {
+    digit[i] = pdg_code % 10;
+    if (digit[i] != 0) ndigits = i+1;
+    pdg_code /= 10; // "shift" things along
+  }
+
+  // start this part with _flav_content already initialised to zero
+  // in constructor
+  if (ndigits == 1) { // a lone quark
+    if (digit[0] > 6 || digit[0] == 0) {
+      cerr << "FlavInfo failed to understand pdg_code = "<<_pdg_code<<endl; exit(-1);}
+    _flav_content[digit[0]] = netsign;
+
+  } else if (ndigits == 2) { // a lepton, photon or cluster [flav lost...]
+    // do nothing...
+
+  } else { // must be a meson, cluster or baryon
+    // check sanity of codes
+    for (int i=1; i < ndigits; i++) {
+      if (digit[i] > 6) {cerr << "FlavInfo failed to understand pdg_code = "
+			       <<_pdg_code<<endl; exit(-1);}}
+
+    // now deal with different cases
+    if (ndigits == 4) { // diquark [nm0x] or baryon [nmpx]
+      for (int i=1; i < ndigits; i++) {
+	if (digit[i] > 0) _flav_content[digit[i]] += netsign;}
+    } else if (ndigits == 3) { // meson [nmx]
+      // Beware of PDG convention that says that a K+ or B+ are a
+      // particle and so have positive pdg_code (i.e. flavcodes > 1). So
+      if (digit[2] == 3 || digit[2] == 5) netsign = -netsign;
+      _flav_content[digit[2]] += netsign;
+      _flav_content[digit[1]] -= netsign;
+    } else {
+      cerr << "FlavInfo failed to understand pdg_code = " <<_pdg_code<<endl; exit(-1);}
+  }
+  update_flavourless_attribute();
+}
+
+//----------------------------------------------------------------------
+void FlavInfo::apply_modulo_2() {
+  for (unsigned iflv = 1; iflv <= 6; iflv++) {
+    _flav_content[iflv] = abs(_flav_content[iflv] % 2);
+  }
+  update_flavourless_attribute();
+}
+
+//----------------------------------------------------------------------
+void FlavInfo::apply_any_abs() {
+  for (unsigned iflv = 1; iflv <= 6; iflv++) {
+    _flav_content[iflv] = _flav_content[iflv] == 0 ? 0 : 1;
+  }
+  update_flavourless_attribute();
+}
+
+//----------------------------------------------------------------------
+void FlavInfo::reset_all_but_flav(int iflv) {
+  for (int i = 1; i <= 6; i++) {
+    if (i != iflv) _flav_content[i] = 0;
+  }
+  update_flavourless_attribute();
+}
+
+//----------------------------------------------------------------------
+bool FlavInfo::operator==(const FlavInfo & other) const {
+  for (unsigned i=0; i<=6; i++){
+    if(operator[](i)!=other[i]) {return 0;};
+  }
+  return 1;
+}
+
+bool FlavInfo::operator!=(const FlavInfo & other) const {
+  for (unsigned i=0; i<=6; i++){
+    if(operator[](i)!=other[i]) {return 1;};
+  }
+  return 0;
+}
+
+
+//----------------------------------------------------------------------
+FlavInfo FlavInfo::operator+(const FlavInfo & other) const {
+  FlavInfo sum(operator[](1)+other[1],
+               operator[](2)+other[2],
+               operator[](3)+other[3],
+               operator[](4)+other[4],
+               operator[](5)+other[5],
+               operator[](6)+other[6]
+               );
+  sum.update_flavourless_attribute();
+  return sum;
+}
+//----------------------------------------------------------------------
+FlavInfo FlavInfo::operator-(const FlavInfo & other) const {
+  FlavInfo sum(operator[](1)-other[1],
+               operator[](2)-other[2],
+               operator[](3)-other[3],
+               operator[](4)-other[4],
+               operator[](5)-other[5],
+               operator[](6)-other[6]
+               );
+  sum.update_flavourless_attribute();
+  return sum;
+}
+
+//----------------------------------------------------------------------
+void FlavInfo::update_flavourless_attribute() {
+  for (unsigned i = 1; i <=6; i++) {
+    if (_flav_content[i] != 0) {
+      _flav_content[0] &= ~ _is_flavourless; // ~ is C++ bitwise not
+      return;
+    }
+  }
+  _flav_content[0] |= _is_flavourless;
+}
+
+//----------------------------------------------------------------------
+bool FlavInfo::is_multiflavoured() const {
+  int flavsum = 0;
+  for (unsigned i = 1; i <=6; i++) flavsum += abs(_flav_content[i]);
+  return flavsum > 1;
+}
+
+bool FlavInfo::has_opposite_flavour(const PseudoJet & particle) const {
+ int t = 0;
+ for(int i = 1; i<=6; i++){
+  if((particle.has_user_info<FlavInfo>()) &&
+    ((particle.user_info<FlavInfo>().operator[](i)*operator[](i) < -0))){
+    t += 1;
+  }
+ }
+  return t > 0;
+}
+
+//----------------------------------------------------------------------
+// an object with no flavour, that we can conveniently point to
+const FlavInfo FlavInfo::_no_flav;
+
+//----------------------------------------------------------------------
+string FlavInfo::description() const {
+  const char * flavs = "duscbt";
+  ostringstream result;
+
+  result << "[";
+  if (is_flavourless()) {
+    result << "g";
+  } else {
+    for (int iflav = 1; iflav <= 6; iflav++) {
+      int n = operator[](iflav);
+      for (unsigned i = 0; i < abs(n); i++) {
+        result << flavs[iflav-1];
+        if (n<0) result << "bar";
+        result << " ";
+      }
+    }
+  }
+  result << "]";
+  if (is_beam()) result << "(beam) ";
+  if (is_spectator()) result << "(spectator) ";
+  return result.str();
+}
+
+
+/// returns the flavour of a particle if that particle has flavour, otherwise
+/// just the default flavour
+const FlavInfo & FlavInfo::flavour_of(const PseudoJet & particle) {
+  if (particle.has_user_info<FlavInfo>()) {
+    return particle.user_info<FlavInfo>();
+  } else if (particle.has_user_info<FlavHistory>()) {
+    throw Error("FlavInfo::flavour_of called on particle with FlavHistory. "
+                "Use FlavHistory::current_flavour_of(...) or "
+                "FlavHistory::initial_flavour_of(...) instead");
+  } else {
+    return _no_flav;
+  }
+}
+
+/// Return the current (final) flavour element of the history of a PseudoJet
+const FlavInfo & FlavHistory::current_flavour_of(const PseudoJet & particle) {
+  if (particle.has_user_info<FlavHistory>()) {
+    return particle.user_info<FlavHistory>().history().back().second;
+  } else if (particle.has_user_info<FlavInfo>()) {
+    return particle.user_info<FlavInfo>();
+  } else {
+    throw fastjet::Error("A particle without FlavHistory was searched for FlavHistory.");
+  }
+}
+
+/// Return the first flavour element of the history of a PseudoJet
+const FlavInfo & FlavHistory::initial_flavour_of(const PseudoJet &jet) {
+  if (jet.has_user_info<FlavHistory>()) {
+    return jet.user_info<FlavHistory>().history()[0].second;
+  } else if (jet.has_user_info<FlavInfo>()) {
+    return jet.user_info<FlavInfo>();
+  } else {
+    throw fastjet::Error(
+        "A particle without FlavHistory was searched for FlavHistory.");
+  }
+}
+
+//----------------------------------------------------------------------
+} // namespace contrib
+FASTJET_END_NAMESPACE