//---------------------------------------------------------------------- /// \file example.cc /// /// This example program is meant to illustrate how the /// fastjet::contrib::FlavorConePlugin class is used. /// /// Run this example with /// /// \verbatim /// ./example < ../data/single-event.dat /// \endverbatim //---------------------------------------------------------------------- // $Id$ // // Copyright (c) 2017, Philip Ilten, Nicholas Rodd, Jesse Thaler, // Michael Williams // //---------------------------------------------------------------------- // 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 . //---------------------------------------------------------------------- #include #include #include #include "fastjet/PseudoJet.hh" #include // In external code, this should be fastjet/contrib/FlavorCone.hh #include "FlavorCone.hh" using namespace std; using namespace fastjet; // Forward declaration to make things clearer void read_event(vector &event); //---------------------------------------------------------------------- int main(){ //---------------------------------------------------------- // Read in input particles vector event; read_event(event); cout << "# Read an event with " << event.size() << " particles" << endl; // setting user indices to keep track of things, and then sorting by pT for (unsigned int ijet = 0; ijet < event.size(); ++ijet) { event[ijet].set_user_index(ijet); } event = sorted_by_pt(event); // Create the seeds. (These are not real seeds, which would be // heavy-flavor-tagged objects, but that information is not contained // in the sample event. So we just use the two hardest pT objects) if (event.size() < 2) return 1; vector seeds; cout << "# Setting two seeds for clustering" << endl; seeds.push_back(event[0]); seeds.push_back(event[1]); // Set the jet radius double rcut(0.5); // Defining FlavorCone as a FastJet plugin // Note that you have to create a new jet definition for each seed choice contrib::FlavorConePlugin jdf(seeds, rcut); // Running flavor cone // Also note that there is no minimum pT cut applied cout << "# Running " << jdf.description() << endl; ClusterSequence jcs(event, &jdf); vector jets = jcs.inclusive_jets(0); // Print the FlavorCone results cout << "#" << setw(9) << "Seed ID" << setw(10) << "px" << setw(10) << "py" << setw(10) << "pz" << setw(10) << "e" << setw(10) << "const." << endl; for (unsigned int ijet = 0; ijet < jets.size(); ++ijet) { // Find the seed used to cluster the jet const contrib::FlavorConePlugin::Extras* extras = dynamic_cast(jcs.extras()); cout << setw(10) << extras->seed(jets[ijet]).user_index(); // Print out the jet four-vector for (int icmp = 0; icmp < 4; ++icmp) { cout << setw(10) << jets[ijet][icmp]; } cout << setw(10) << jets[ijet].constituents().size(); cout << endl; } return 0; } // Read in input particles void read_event(vector &event){ string line; while (getline(cin, line)) { istringstream linestream(line); // Take substrings to avoid problems when there is extra "pollution" // characters (e.g. line-feed) if (line.substr(0,4) == "#END") {return;} if (line.substr(0,1) == "#") {continue;} double px,py,pz,E; linestream >> px >> py >> pz >> E; PseudoJet particle(px,py,pz,E); // Push event onto back of full_event vector event.push_back(particle); } }