// VariableR Package
// Questions/Comments? jthaler@jthaler.net
//
// Copyright (c) 2009-2016
// David Krohn, Gregory Soyez, Jesse Thaler, and Lian-Tao Wang
//
// $Id$
//----------------------------------------------------------------------
// 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
#include "fastjet/PseudoJet.hh"
#include
#include "VariableRPlugin.hh" // In external code, this should be fastjet/contrib/VariableRPlugin.hh
//#include "VariableR.hh" // This header is still available for backwards compatibility.
using namespace std;
using namespace fastjet;
using namespace contrib;
void print_jets (const fastjet::ClusterSequence &,
const vector &);
// 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;
//----------------------------------------------------------
// illustrate how VariableR contrib works
// anti-kT variable R
//----------------------------------------------------------
// defining parameters
double rho = 2000.0;
double min_r = 0.0;
double max_r = 2.0;
double ptmin = 5.0;
VariableRPlugin lvjet_pluginAKT(rho, min_r, max_r, VariableRPlugin::AKTLIKE);
fastjet::JetDefinition jet_defAKT(&lvjet_pluginAKT);
fastjet::ClusterSequence clust_seqAKT(event, jet_defAKT);
// tell the user what was done
cout << "# Ran " << jet_defAKT.description() << endl;
// extract the inclusive jets with pt > 5 GeV
vector inclusive_jetsAKT = clust_seqAKT.inclusive_jets(ptmin);
// print them out
cout << "Printing inclusive jets with pt > "<< ptmin <<" GeV\n";
cout << "---------------------------------------\n";
print_jets(clust_seqAKT, inclusive_jetsAKT);
cout << endl;
//----------------------------------------------------------
// Same for Cambridge-Aachen variable R
//----------------------------------------------------------
VariableRPlugin lvjet_pluginCA(rho, min_r, max_r, VariableRPlugin::CALIKE);
fastjet::JetDefinition jet_defCA(&lvjet_pluginCA);
fastjet::ClusterSequence clust_seqCA(event, jet_defCA);
// tell the user what was done
cout << "# Ran " << jet_defCA.description() << endl;
// extract the inclusive jets with pt > 5 GeV
vector inclusive_jetsCA = clust_seqCA.inclusive_jets(ptmin);
// print them out
cout << "Printing inclusive jets with pt > "<< ptmin <<" GeV\n";
cout << "---------------------------------------\n";
print_jets(clust_seqCA, inclusive_jetsCA);
cout << endl;
//----------------------------------------------------------
// Illustrating preclustering feature new in v1.1
// Need to have minimum jet radius for preclustering to make sense
//----------------------------------------------------------
min_r = 0.4; // change small radius to allow for preclustering
bool use_preclustering = true;
VariableRPlugin lvjet_pluginAKT_precluster(rho, min_r, max_r, VariableRPlugin::AKTLIKE,use_preclustering);
fastjet::JetDefinition jet_defAKT_precluster(&lvjet_pluginAKT_precluster);
fastjet::ClusterSequence clust_seqAKT_precluster(event, jet_defAKT_precluster);
// tell the user what was done
cout << "# Ran " << jet_defAKT_precluster.description() << endl;
// extract the inclusive jets with pt > 5 GeV
vector inclusive_jetsAKT_precluster = clust_seqAKT_precluster.inclusive_jets(ptmin);
// print them out
cout << "Printing inclusive jets with pt > "<< ptmin <<" GeV\n";
cout << "---------------------------------------\n";
print_jets(clust_seqAKT_precluster, inclusive_jetsAKT_precluster);
cout << endl;
//----------------------------------------------------------
// As a cross check, same as above, but with no preclustering
// (Results should be nearly identical)
//----------------------------------------------------------
use_preclustering = false;
VariableRPlugin lvjet_pluginAKT_noprecluster(rho, min_r, max_r, VariableRPlugin::AKTLIKE,use_preclustering);
fastjet::JetDefinition jet_defAKT_noprecluster(&lvjet_pluginAKT_noprecluster);
fastjet::ClusterSequence clust_seqAKT_noprecluster(event, jet_defAKT_noprecluster);
// tell the user what was done
cout << "# Ran " << jet_defAKT_noprecluster.description() << endl;
// extract the inclusive jets with pt > 5 GeV
vector inclusive_jetsAKT_noprecluster = clust_seqAKT_noprecluster.inclusive_jets(ptmin);
// print them out
cout << "Printing inclusive jets with pt > "<< ptmin <<" GeV\n";
cout << "---------------------------------------\n";
print_jets(clust_seqAKT_noprecluster, inclusive_jetsAKT_noprecluster);
cout << endl;
//----------------------------------------------------------
// An example with generalised kt
//----------------------------------------------------------
VariableRPlugin lvjet_pluginGenKT(rho, min_r, max_r, -0.5); // p = -0.5 (halfway between CA and anti-kt)
fastjet::JetDefinition jet_defGenKT(&lvjet_pluginGenKT);
fastjet::ClusterSequence clust_seqGenKT(event, jet_defGenKT);
// tell the user what was done
cout << "# Ran " << jet_defGenKT.description() << endl;
// extract the inclusive jets with pt > 5 GeV
vector inclusive_jetsGenKT = clust_seqGenKT.inclusive_jets(ptmin);
// print them out
cout << "Printing inclusive jets with pt > "<< ptmin <<" GeV\n";
cout << "---------------------------------------\n";
print_jets(clust_seqGenKT, inclusive_jetsGenKT);
cout << endl;
// timing tests for the developers
double do_timing_test = false;
if (do_timing_test) {
clock_t clock_begin, clock_end;
double num_iter;
num_iter = 10;
min_r = 0.4;
use_preclustering = false;
// Testing Native
clock_begin = clock();
for (int t = 0; t < num_iter; t++) {
VariableRPlugin lvjet_pluginAKT(rho, min_r, max_r, VariableRPlugin::AKTLIKE,use_preclustering,VariableRPlugin::Native);
fastjet::JetDefinition jet_defAKT(&lvjet_pluginAKT);
fastjet::ClusterSequence clust_seqAKT(event, jet_defAKT);
vector inclusive_jetsAKT = clust_seqAKT.inclusive_jets(ptmin);
}
clock_end = clock();
cout << "# Native: " << (clock_end-clock_begin)/double(CLOCKS_PER_SEC*num_iter)*1000 << " ms per event"<< endl;
// Testing NNH
clock_begin = clock();
for (int t = 0; t < num_iter; t++) {
VariableRPlugin lvjet_pluginAKT(rho, min_r, max_r, VariableRPlugin::AKTLIKE,use_preclustering,VariableRPlugin::NNH);
fastjet::JetDefinition jet_defAKT(&lvjet_pluginAKT);
fastjet::ClusterSequence clust_seqAKT(event, jet_defAKT);
vector inclusive_jetsAKT = clust_seqAKT.inclusive_jets(ptmin);
}
clock_end = clock();
cout << "# NNH: " << (clock_end-clock_begin)/double(CLOCKS_PER_SEC*num_iter)*1000 << " ms per event"<< endl;
#if FASTJET_VERSION_NUMBER >= 30200
// Testing N2Tiled
clock_begin = clock();
for (int t = 0; t < num_iter; t++) {
VariableRPlugin lvjet_pluginAKT(rho, min_r, max_r, VariableRPlugin::AKTLIKE,use_preclustering,VariableRPlugin::N2Tiled);
fastjet::JetDefinition jet_defAKT(&lvjet_pluginAKT);
fastjet::ClusterSequence clust_seqAKT(event, jet_defAKT);
vector inclusive_jetsAKT = clust_seqAKT.inclusive_jets(ptmin);
}
clock_end = clock();
cout << "# N2Tiled: " << (clock_end-clock_begin)/double(CLOCKS_PER_SEC*num_iter)*1000 << " ms per event"<< endl;
// Testing N2Plain
clock_begin = clock();
for (int t = 0; t < num_iter; t++) {
VariableRPlugin lvjet_pluginAKT(rho, min_r, max_r, VariableRPlugin::AKTLIKE,use_preclustering,VariableRPlugin::N2Plain);
fastjet::JetDefinition jet_defAKT(&lvjet_pluginAKT);
fastjet::ClusterSequence clust_seqAKT(event, jet_defAKT);
vector inclusive_jetsAKT = clust_seqAKT.inclusive_jets(ptmin);
}
clock_end = clock();
cout << "# N2Plain: " << (clock_end-clock_begin)/double(CLOCKS_PER_SEC*num_iter)*1000 << " ms per event"<< endl;
#endif
// Testing Best
clock_begin = clock();
for (int t = 0; t < num_iter; t++) {
VariableRPlugin lvjet_pluginAKT(rho, min_r, max_r, VariableRPlugin::AKTLIKE,use_preclustering,VariableRPlugin::Best);
fastjet::JetDefinition jet_defAKT(&lvjet_pluginAKT);
fastjet::ClusterSequence clust_seqAKT(event, jet_defAKT);
vector inclusive_jetsAKT = clust_seqAKT.inclusive_jets(ptmin);
}
clock_end = clock();
cout << "# Best: " << (clock_end-clock_begin)/double(CLOCKS_PER_SEC*num_iter)*1000 << " ms per event"<< 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 are 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);
}
}
//----------------------------------------------------------------------
/// a function that pretty prints a list of jets
void print_jets (const fastjet::ClusterSequence & clust_seq,
const vector & jets) {
// sort jets into increasing pt
vector sorted_jets = sorted_by_pt(jets);
// label the columns
printf("%5s %10s %10s %10s %10s %10s %10s\n","jet #", "rapidity",
"phi", "pt","m","e", "n constituents");
// print out the details for each jet
for (unsigned int i = 0; i < sorted_jets.size(); i++) {
int n_constituents = clust_seq.constituents(sorted_jets[i]).size();
printf("%5u %10.3f %10.3f %10.3f %10.3f %10.3f %8u\n",
i, sorted_jets[i].rap(), sorted_jets[i].phi(),
sorted_jets[i].perp(),sorted_jets[i].m(),sorted_jets[i].e(), n_constituents);
}
}