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