// Nsubjettiness Package
// Questions/Comments? jthaler@jthaler.net
//
// Copyright (c) 2011-13
// Jesse Thaler, Ken Van Tilburg, Christopher K. Vermilion, and TJ Wilkason
//
// Run this example with
// ./example_advanced_usage < ../data/single-ee-event.dat
//
// Note that this program is no longer used in the "make test" routines
// as of version 2.3.0, since it involves using an ee measure with
// pp axes.
//
// $Id: example_advanced_usage.cc 750 2014-10-08 15:32:14Z tjwilk $
//----------------------------------------------------------------------
// 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
#include
#include
#include
#include
#include "fastjet/PseudoJet.hh"
#include "fastjet/ClusterSequenceArea.hh"
#include
#include "Nsubjettiness.hh" // In external code, this should be fastjet/contrib/Nsubjettiness.hh
#include "Njettiness.hh"
#include "NjettinessPlugin.hh"
using namespace std;
using namespace fastjet;
using namespace fastjet::contrib;
// forward declaration to make things clearer
void read_event(vector &event);
void analyze(const vector & input_particles);
//----------------------------------------------------------------------
int main(){
//----------------------------------------------------------
// read in input particles
vector event;
read_event(event);
cout << "# read an event with " << event.size() << " particles" << endl;
//----------------------------------------------------------
// illustrate how Nsubjettiness contrib works
analyze(event);
return 0;
}
// Simple class to store Axes along with a name for display
class AxesStruct {
private:
// Shared Ptr so it handles memory management
SharedPtr _axes_def;
public:
AxesStruct(const AxesDefinition & axes_def)
: _axes_def(axes_def.create()) {}
// Need special copy constructor to make it possible to put in a std::vector
AxesStruct(const AxesStruct& myStruct)
: _axes_def(myStruct._axes_def->create()) {}
const AxesDefinition & def() const {return *_axes_def;}
string description() const {return _axes_def->description();}
string short_description() const {return _axes_def->short_description();}
};
// Simple class to store Measures to make it easier to put in std::vector
class MeasureStruct {
private:
// Shared Ptr so it handles memory management
SharedPtr _measure_def;
public:
MeasureStruct(const MeasureDefinition& measure_def)
: _measure_def(measure_def.create()) {}
// Need special copy constructor to make it possible to put in a std::vector
MeasureStruct(const MeasureStruct& myStruct)
: _measure_def(myStruct._measure_def->create()) {}
const MeasureDefinition & def() const {return *_measure_def;}
string description() const {return _measure_def->description();}
};
// 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);
}
}
// Helper Function for Printing out Jet Information
void PrintJets(const vector & jets, bool commentOut = false);
void PrintAxes(const vector & jets, bool commentOut = false);
void PrintJetsWithComponents(const vector & jets, bool commentOut = false);
////////
//
// Main Routine for Analysis
//
///////
void analyze(const vector & input_particles) {
////////
//
// This code will check multiple axes/measure modes
// First thing we do is establish the various modes we will check
//
///////
//Define characteristic test parameters to use here
double p = 0.5;
double delta = 10.0; // close to winner-take-all. TODO: Think about right value here.
double R0 = 0.2;
double Rcutoff = 0.5;
int nExtra = 2;
int NPass = 10;
// A list of all of the available axes modes
vector _testAxes;
_testAxes.push_back(KT_Axes());
_testAxes.push_back(CA_Axes());
_testAxes.push_back(AntiKT_Axes(R0));
_testAxes.push_back(WTA_KT_Axes());
_testAxes.push_back(WTA_CA_Axes());
_testAxes.push_back(WTA_GenKT_Axes(p, R0));
_testAxes.push_back(GenET_GenKT_Axes(delta, p, R0));
_testAxes.push_back(OnePass_KT_Axes());
_testAxes.push_back(OnePass_AntiKT_Axes(R0));
_testAxes.push_back(OnePass_WTA_KT_Axes());
_testAxes.push_back(OnePass_WTA_GenKT_Axes(p, R0));
_testAxes.push_back(OnePass_GenET_GenKT_Axes(delta, p, R0));
_testAxes.push_back(Comb_WTA_GenKT_Axes(nExtra, p, R0));
_testAxes.push_back(Comb_GenET_GenKT_Axes(nExtra, delta, p, R0));
// these axes are not checked during make check since they do not give reliable results
_testAxes.push_back(OnePass_CA_Axes()); // not recommended
_testAxes.push_back(OnePass_WTA_CA_Axes()); // not recommended
_testAxes.push_back(MultiPass_Axes(NPass));
int num_unchecked = 3; // number of unchecked axes
//
// Note: Njettiness::min_axes is not guarenteed to give a global
// minimum, only a local minimum, and different choices of the random
// number seed can give different results. For that reason,
// the one-pass minimization are recommended over min_axes.
//
// Getting a smaller list of recommended axes modes
// These are the ones that are more likely to give sensible results (and are all IRC safe)
vector _testRecommendedAxes;
_testRecommendedAxes.push_back(KT_Axes());
_testRecommendedAxes.push_back(WTA_KT_Axes());
_testRecommendedAxes.push_back(OnePass_KT_Axes());
_testRecommendedAxes.push_back(OnePass_WTA_KT_Axes());
// Getting some of the measure modes to test
// (When applied to a single jet we won't test the cutoff measures,
// since cutoffs aren't typically helpful when applied to single jets)
// Note that we are calling measures by their MeasureDefinition
vector _testMeasures;
// e+e- versions of the measures
_testMeasures.push_back( NormalizedMeasure(1.0, 1.0, E_theta));
_testMeasures.push_back(UnnormalizedMeasure(1.0 , E_theta));
_testMeasures.push_back( NormalizedMeasure(2.0, 1.0, E_theta));
_testMeasures.push_back(UnnormalizedMeasure(2.0 , E_theta));
// When doing Njettiness as a jet algorithm, want to test the cutoff measures.
// (Since they are not senisible without a cutoff)
vector _testCutoffMeasures;
_testCutoffMeasures.push_back(UnnormalizedCutoffMeasure(1.0, Rcutoff, E_theta));
_testCutoffMeasures.push_back(UnnormalizedCutoffMeasure(2.0, Rcutoff, E_theta));
/////// N-subjettiness /////////////////////////////
////////
//
// Start of analysis. First find anti-kT jets, then find N-subjettiness values of those jets
//
///////
// Initial clustering with anti-kt algorithm
JetAlgorithm algorithm = antikt_algorithm;
double jet_rad = 1.00; // jet radius for anti-kt algorithm
JetDefinition jetDef = JetDefinition(algorithm,jet_rad,E_scheme,Best);
ClusterSequence clust_seq(input_particles,jetDef);
vector antikt_jets = sorted_by_pt(clust_seq.inclusive_jets());
// small number to show equivalence of doubles
double epsilon = 0.0001;
for (int j = 0; j < 2; j++) { // Two hardest jets per event
// if (antikt_jets[j].perp() < 200) continue;
vector jet_constituents = clust_seq.constituents(antikt_jets[j]);
cout << "-----------------------------------------------------------------------------------------------" << endl;
cout << "Analyzing Jet " << j + 1 << ":" << endl;
cout << "-----------------------------------------------------------------------------------------------" << endl;
////////
//
// Basic checks of tau values first
//
// If you don't want to know the directions of the subjets,
// then you can use the simple function Nsubjettiness.
//
// Recommended usage for Nsubjettiness:
// AxesMode: kt_axes, wta_kt_axes, onepass_kt_axes, or onepass_wta_kt_axes
// MeasureMode: unnormalized_measure
// beta with kt_axes: 2.0
// beta with wta_kt_axes: anything greater than 0.0 (particularly good for 1.0)
// beta with onepass_kt_axes or onepass_wta_kt_axes: between 1.0 and 3.0
//
///////
cout << "-----------------------------------------------------------------------------------------------" << endl;
cout << "Outputting N-subjettiness Values" << endl;
cout << "-----------------------------------------------------------------------------------------------" << endl;
// Now loop through all options
cout << setprecision(6) << right << fixed;
for (unsigned iM = 0; iM < _testMeasures.size(); iM++) {
cout << "-----------------------------------------------------------------------------------------------" << endl;
cout << _testMeasures[iM].description() << ":" << endl;
cout << setw(25) << "AxisMode"
<< setw(14) << "tau1"
<< setw(14) << "tau2"
<< setw(14) << "tau3"
<< setw(14) << "tau2/tau1"
<< setw(14) << "tau3/tau2"
<< endl;
for (unsigned iA = 0; iA < _testAxes.size(); iA++) {
// Current axes/measure modes and particles
const PseudoJet & my_jet = antikt_jets[j];
const vector particles = my_jet.constituents();
const AxesDefinition & axes_def = _testAxes[iA].def();
const MeasureDefinition & measure_def = _testMeasures[iM].def();
// This case doesn't work, so skip it.
// if (axes_def.givesRandomizedResults()) continue;
// define Nsubjettiness functions
Nsubjettiness nSub1(1, axes_def, measure_def);
Nsubjettiness nSub2(2, axes_def, measure_def);
Nsubjettiness nSub3(3, axes_def, measure_def);
NsubjettinessRatio nSub21(2,1, axes_def, measure_def);
NsubjettinessRatio nSub32(3,2, axes_def, measure_def);
// calculate Nsubjettiness values
double tau1 = nSub1(my_jet);
double tau2 = nSub2(my_jet);
double tau3 = nSub3(my_jet);
double tau21 = nSub21(my_jet);
double tau32 = nSub32(my_jet);
// An entirely equivalent, but painful way to calculate is:
double tau1alt = measure_def(particles,axes_def(1,particles,&measure_def));
double tau2alt = measure_def(particles,axes_def(2,particles,&measure_def));
double tau3alt = measure_def(particles,axes_def(3,particles,&measure_def));
// Make sure calculations are consistent
if (!_testAxes[iA].def().givesRandomizedResults()) {
assert(tau1alt == tau1);
assert(tau2alt == tau2);
assert(tau3alt == tau3);
assert(abs(tau21 - tau2/tau1) < epsilon);
assert(abs(tau32 - tau3/tau2) < epsilon);
}
string axesName = _testAxes[iA].short_description();
string left_hashtag;
// comment out with # because MultiPass uses random number seed, or because axes do not give reliable results (those at the end of axes vector)
if (_testAxes[iA].def().givesRandomizedResults() || iA >= (_testAxes.size() - num_unchecked)) left_hashtag = "#";
else left_hashtag = " ";
// Output results:
cout << std::right
<< left_hashtag
<< setw(23)
<< axesName
<< ":"
<< setw(14) << tau1
<< setw(14) << tau2
<< setw(14) << tau3
<< setw(14) << tau21
<< setw(14) << tau32
<< endl;
}
}
cout << "-----------------------------------------------------------------------------------------------" << endl;
cout << "Done Outputting N-subjettiness Values" << endl;
cout << "-----------------------------------------------------------------------------------------------" << endl;
////////
//
// Finding axes/jets found by N-subjettiness partitioning
//
// This uses the component_results function to get the subjet information
//
///////
cout << "-----------------------------------------------------------------------------------------------" << endl;
cout << "Outputting N-subjettiness Subjets" << endl;
cout << "-----------------------------------------------------------------------------------------------" << endl;
// Loop through all options, this time setting up jet finding
cout << setprecision(6) << left << fixed;
for (unsigned iM = 0; iM < _testMeasures.size(); iM++) {
for (unsigned iA = 0; iA < _testRecommendedAxes.size(); iA++) {
const PseudoJet & my_jet = antikt_jets[j];
const AxesDefinition & axes_def = _testRecommendedAxes[iA].def();
const MeasureDefinition & measure_def = _testMeasures[iM].def();
// This case doesn't work, so skip it.
if (axes_def.givesRandomizedResults()) continue;
// define Nsubjettiness functions
Nsubjettiness nSub1(1, axes_def, measure_def);
Nsubjettiness nSub2(2, axes_def, measure_def);
Nsubjettiness nSub3(3, axes_def, measure_def);
// get component results
TauComponents tau1comp = nSub1.component_result(my_jet);
TauComponents tau2comp = nSub2.component_result(my_jet);
TauComponents tau3comp = nSub3.component_result(my_jet);
vector jets1 = tau1comp.jets();
vector jets2 = tau2comp.jets();
vector jets3 = tau3comp.jets();
vector axes1 = tau1comp.axes();
vector axes2 = tau2comp.axes();
vector axes3 = tau3comp.axes();
cout << "-----------------------------------------------------------------------------------------------" << endl;
cout << measure_def.description() << ":" << endl;
cout << axes_def.description() << ":" << endl;
bool commentOut = false;
if (axes_def.givesRandomizedResults()) commentOut = true; // have to comment out min_axes, because it has random values
// This helper function tries to find out if the jets have tau information for printing
PrintJetsWithComponents(jets1,commentOut);
cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
PrintJetsWithComponents(jets2,commentOut);
cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
PrintJetsWithComponents(jets3,commentOut);
cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" << endl;
cout << "Axes Used for Above Subjets" << endl;
// PrintJets(axes1,commentOut);
// cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
// PrintJets(axes2,commentOut);
// cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
// PrintJets(axes3,commentOut);
PrintAxes(axes1,commentOut);
cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
PrintAxes(axes2,commentOut);
cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
PrintAxes(axes3,commentOut);
}
}
cout << "-----------------------------------------------------------------------------------------------" << endl;
cout << "Done Outputting N-subjettiness Subjets" << endl;
cout << "-----------------------------------------------------------------------------------------------" << endl;
}
////////// N-jettiness as a jet algorithm ///////////////////////////
////////
//
// You can also find jets event-wide with Njettiness.
// In this case, Winner-Take-All axes are a must, since the other axes get trapped in local minima
//
// Recommended usage of NjettinessPlugin (event-wide)
// AxesMode: wta_kt_axes or onepass_wta_kt_axes
// MeasureMode: unnormalized_measure
// beta with wta_kt_axes: anything greater than 0.0 (particularly good for 1.0)
// beta with onepass_wta_kt_axes: between 1.0 and 3.0
//
///////
cout << "-----------------------------------------------------------------------------------------------" << endl;
cout << "Using N-jettiness as a Jet Algorithm" << endl;
cout << "-----------------------------------------------------------------------------------------------" << endl;
for (unsigned iM = 0; iM < _testCutoffMeasures.size(); iM++) {
for (unsigned iA = 0; iA < _testRecommendedAxes.size(); iA++) {
const AxesDefinition & axes_def = _testRecommendedAxes[iA].def();
const MeasureDefinition & measure_def = _testCutoffMeasures[iM].def();
// define the plugins
NjettinessPlugin njet_plugin2(2, axes_def,measure_def);
NjettinessPlugin njet_plugin3(3, axes_def,measure_def);
NjettinessPlugin njet_plugin4(4, axes_def,measure_def);
// and the jet definitions
JetDefinition njet_jetDef2(&njet_plugin2);
JetDefinition njet_jetDef3(&njet_plugin3);
JetDefinition njet_jetDef4(&njet_plugin4);
// and the cluster sequences
ClusterSequence njet_seq2(input_particles, njet_jetDef2);
ClusterSequence njet_seq3(input_particles, njet_jetDef3);
ClusterSequence njet_seq4(input_particles, njet_jetDef4);
// and associated extras for more information
const NjettinessExtras * extras2 = njettiness_extras(njet_seq2);
const NjettinessExtras * extras3 = njettiness_extras(njet_seq3);
const NjettinessExtras * extras4 = njettiness_extras(njet_seq4);
// and find the jets
vector njet_jets2 = njet_seq2.inclusive_jets();
vector njet_jets3 = njet_seq3.inclusive_jets();
vector njet_jets4 = njet_seq4.inclusive_jets();
// (alternative way to find the jets)
//vector njet_jets2 = extras2->jets();
//vector njet_jets3 = extras3->jets();
//vector njet_jets4 = extras4->jets();
cout << "-----------------------------------------------------------------------------------------------" << endl;
cout << measure_def.description() << ":" << endl;
cout << axes_def.description() << ":" << endl;
PrintJets(njet_jets2);
cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
PrintJets(njet_jets3);
cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
PrintJets(njet_jets4);
// The axes might point in a different direction than the jets
// Using the NjettinessExtras pointer (ClusterSequence::Extras) to access that information
vector njet_axes2 = extras2->axes();
vector njet_axes3 = extras3->axes();
vector njet_axes4 = extras4->axes();
cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" << endl;
cout << "Axes Used for Above Jets" << endl;
PrintAxes(njet_axes2);
cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
PrintAxes(njet_axes3);
cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
PrintAxes(njet_axes4);
bool calculateArea = false;
if (calculateArea) {
cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" << endl;
cout << "Adding Area Information (quite slow)" << endl;
double ghost_maxrap = 5.0; // e.g. if particles go up to y=5
AreaDefinition area_def(active_area_explicit_ghosts, GhostedAreaSpec(ghost_maxrap));
// Defining cluster sequences with area
ClusterSequenceArea njet_seq_area2(input_particles, njet_jetDef2, area_def);
ClusterSequenceArea njet_seq_area3(input_particles, njet_jetDef3, area_def);
ClusterSequenceArea njet_seq_area4(input_particles, njet_jetDef4, area_def);
vector njet_jets_area2 = njet_seq_area2.inclusive_jets();
vector njet_jets_area3 = njet_seq_area3.inclusive_jets();
vector njet_jets_area4 = njet_seq_area4.inclusive_jets();
PrintJets(njet_jets_area2);
cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
PrintJets(njet_jets_area3);
cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
PrintJets(njet_jets_area4);
}
}
}
cout << "-----------------------------------------------------------------------------------------------" << endl;
cout << "Done Using N-jettiness as a Jet Algorithm" << endl;
cout << "-----------------------------------------------------------------------------------------------" << endl;
}
void PrintJets(const vector & jets, bool commentOut) {
string commentStr = "";
if (commentOut) commentStr = "#";
// gets extras information
if (jets.size() == 0) return;
const NjettinessExtras * extras = njettiness_extras(jets[0]);
// bool useExtras = true;
bool useExtras = (extras != NULL);
bool useArea = jets[0].has_area();
bool useConstit = jets[0].has_constituents();
// define nice tauN header
int N = jets.size();
stringstream ss(""); ss << "tau" << N; string tauName = ss.str();
cout << fixed << right;
cout << commentStr << setw(5) << "jet #" << " "
<< setw(10) << "rap"
<< setw(10) << "phi"
<< setw(11) << "pt"
<< setw(11) << "m"
<< setw(11) << "e";
if (useConstit) cout << setw(11) << "constit";
if (useExtras) cout << setw(14) << tauName;
if (useArea) cout << setw(10) << "area";
cout << endl;
fastjet::PseudoJet total(0,0,0,0);
int total_constit = 0;
// print out individual jet information
for (unsigned i = 0; i < jets.size(); i++) {
cout << commentStr << setw(5) << i+1 << " "
<< setprecision(4) << setw(10) << jets[i].rap()
<< setprecision(4) << setw(10) << jets[i].phi()
<< setprecision(4) << setw(11) << jets[i].perp()
<< setprecision(4) << setw(11) << max(jets[i].m(),0.0) // needed to fix -0.0 issue on some compilers.
<< setprecision(4) << setw(11) << jets[i].e();
if (useConstit) cout << setprecision(4) << setw(11) << jets[i].constituents().size();
if (useExtras) cout << setprecision(6) << setw(14) << max(extras->subTau(jets[i]),0.0);
if (useArea) cout << setprecision(4) << setw(10) << (jets[i].has_area() ? jets[i].area() : 0.0 );
cout << endl;
total += jets[i];
if (useConstit) total_constit += jets[i].constituents().size();
}
// print out total jet
if (useExtras) {
double beamTau = extras->beamTau();
if (beamTau > 0.0) {
cout << commentStr << setw(5) << " beam" << " "
<< setw(10) << ""
<< setw(10) << ""
<< setw(11) << ""
<< setw(11) << ""
<< setw(11) << ""
<< setw(11) << ""
<< setw(14) << setprecision(6) << beamTau
<< endl;
}
cout << commentStr << setw(5) << "total" << " "
<< setprecision(4) << setw(10) << total.rap()
<< setprecision(4) << setw(10) << total.phi()
<< setprecision(4) << setw(11) << total.perp()
<< setprecision(4) << setw(11) << max(total.m(),0.0) // needed to fix -0.0 issue on some compilers.
<< setprecision(4) << setw(11) << total.e();
if (useConstit) cout << setprecision(4) << setw(11) << total_constit;
if (useExtras) cout << setprecision(6) << setw(14) << extras->totalTau();
if (useArea) cout << setprecision(4) << setw(10) << (total.has_area() ? total.area() : 0.0);
cout << endl;
}
}
void PrintAxes(const vector & jets, bool commentOut) {
string commentStr = "";
if (commentOut) commentStr = "#";
// gets extras information
if (jets.size() == 0) return;
const NjettinessExtras * extras = njettiness_extras(jets[0]);
// bool useExtras = true;
bool useExtras = (extras != NULL);
bool useArea = jets[0].has_area();
// define nice tauN header
int N = jets.size();
stringstream ss(""); ss << "tau" << N; string tauName = ss.str();
cout << fixed << right;
cout << commentStr << setw(5) << "jet #" << " "
<< setw(10) << "rap"
<< setw(10) << "phi"
<< setw(11) << "pt"
<< setw(11) << "m"
<< setw(11) << "e";
if (useExtras) cout << setw(14) << tauName;
if (useArea) cout << setw(10) << "area";
cout << endl;
fastjet::PseudoJet total(0,0,0,0);
// print out individual jet information
for (unsigned i = 0; i < jets.size(); i++) {
cout << commentStr << setw(5) << i+1 << " "
<< setprecision(4) << setw(10) << jets[i].rap()
<< setprecision(4) << setw(10) << jets[i].phi()
<< setprecision(4) << setw(11) << jets[i].perp()
<< setprecision(4) << setw(11) << max(jets[i].m(),0.0) // needed to fix -0.0 issue on some compilers.
<< setprecision(4) << setw(11) << jets[i].e();
if (useExtras) cout << setprecision(6) << setw(14) << max(extras->subTau(jets[i]),0.0);
if (useArea) cout << setprecision(4) << setw(10) << (jets[i].has_area() ? jets[i].area() : 0.0 );
cout << endl;
total += jets[i];
}
// print out total jet
if (useExtras) {
double beamTau = extras->beamTau();
if (beamTau > 0.0) {
cout << commentStr << setw(5) << " beam" << " "
<< setw(10) << ""
<< setw(10) << ""
<< setw(11) << ""
<< setw(11) << ""
<< setw(11) << ""
<< setw(14) << setprecision(6) << beamTau
<< endl;
}
cout << commentStr << setw(5) << "total" << " "
<< setprecision(4) << setw(10) << total.rap()
<< setprecision(4) << setw(10) << total.phi()
<< setprecision(4) << setw(11) << total.perp()
<< setprecision(4) << setw(11) << max(total.m(),0.0) // needed to fix -0.0 issue on some compilers.
<< setprecision(4) << setw(11) << total.e()
<< setprecision(6) << setw(14) << extras->totalTau();
if (useArea) cout << setprecision(4) << setw(10) << (total.has_area() ? total.area() : 0.0);
cout << endl;
}
}
void PrintJetsWithComponents(const vector & jets, bool commentOut) {
string commentStr = "";
if (commentOut) commentStr = "#";
bool useArea = jets[0].has_area();
// define nice tauN header
int N = jets.size();
stringstream ss(""); ss << "tau" << N; string tauName = ss.str();
cout << fixed << right;
cout << commentStr << setw(5) << "jet #" << " "
<< setw(10) << "rap"
<< setw(10) << "phi"
<< setw(11) << "pt"
<< setw(11) << "m"
<< setw(11) << "e";
if (jets[0].has_constituents()) cout << setw(11) << "constit";
cout << setw(14) << tauName;
if (useArea) cout << setw(10) << "area";
cout << endl;
fastjet::PseudoJet total(0,0,0,0);
double total_tau = 0;
int total_constit = 0;
// print out individual jet information
for (unsigned i = 0; i < jets.size(); i++) {
double thisTau = jets[i].structure_of().tau();
cout << commentStr << setw(5) << i+1 << " "
<< setprecision(4) << setw(10) << jets[i].rap()
<< setprecision(4) << setw(10) << jets[i].phi()
<< setprecision(4) << setw(11) << jets[i].perp()
<< setprecision(4) << setw(11) << max(jets[i].m(),0.0) // needed to fix -0.0 issue on some compilers.
<< setprecision(4) << setw(11) << jets[i].e();
if (jets[i].has_constituents()) cout << setprecision(4) << setw(11) << jets[i].constituents().size();
cout << setprecision(6) << setw(14) << max(thisTau,0.0);
if (useArea) cout << setprecision(4) << setw(10) << (jets[i].has_area() ? jets[i].area() : 0.0 );
cout << endl;
total += jets[i];
total_tau += thisTau;
if (jets[i].has_constituents()) total_constit += jets[i].constituents().size();
}
cout << commentStr << setw(5) << "total" << " "
<< setprecision(4) << setw(10) << total.rap()
<< setprecision(4) << setw(10) << total.phi()
<< setprecision(4) << setw(11) << total.perp()
<< setprecision(4) << setw(11) << max(total.m(),0.0) // needed to fix -0.0 issue on some compilers.
<< setprecision(4) << setw(11) << total.e();
if (jets[0].has_constituents()) cout << setprecision(4) << setw(11) << total_constit;
cout << setprecision(6) << setw(14) << total_tau;
if (useArea) cout << setprecision(4) << setw(10) << (total.has_area() ? total.area() : 0.0);
cout << endl;
}