// 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_basic_usage < ../data/single-event.dat // // $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 #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" #include "XConePlugin.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; } // 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, const TauComponents & components, bool showTotal = true); void PrintXConeJets(const vector & jets, bool commentOut = false); void PrintXConeAxes(const vector & jets, bool commentOut = false); //////// // // Main Routine for Analysis // /////// void analyze(const vector & input_particles) { //////// // // 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()); for (int j = 0; j < 2; j++) { // Two hardest jets per event // get the jet for analysis PseudoJet this_jet = antikt_jets[j]; // only look at if harder than 200 GeV if (this_jet.perp() < 200.0) continue; 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: HalfKT_Axes(), WTA_KT_Axes() // MeasureMode: Unnormalized_Measure(beta) // beta with HalfKT_Axes: 2.0 // beta with WTA_KT_Axes: anything greater than 0.0 (particularly good for 1.0) // // N.B. Because of instabilities with numerical minimization, OnePass axes are no longer recommended as of version 2.3.0 /////// cout << "-------------------------------------------------------------------------------------" << endl; cout << "N-subjettiness with Unnormalized Measure (in GeV)" << endl; cout << "beta = 1.0: Winner-Take-All kT Axes" << endl; cout << "beta = 2.0: E-Scheme Half-kT Axes" << endl; cout << "-------------------------------------------------------------------------------------" << endl; // Now loop through all options cout << setprecision(6) << right << fixed; cout << "-------------------------------------------------------------------------------------" << endl; cout << setw(15) << "beta" << setw(14) << "tau1" << setw(14) << "tau2" << setw(14) << "tau3" << setw(14) << "tau2/tau1" << setw(14) << "tau3/tau2" << endl; // Define Nsubjettiness functions for beta = 1.0 using WTA KT axes double beta = 1.0; Nsubjettiness nSub1_beta1(1, WTA_KT_Axes(), UnnormalizedMeasure(beta)); Nsubjettiness nSub2_beta1(2, WTA_KT_Axes(), UnnormalizedMeasure(beta)); Nsubjettiness nSub3_beta1(3, WTA_KT_Axes(), UnnormalizedMeasure(beta)); NsubjettinessRatio nSub21_beta1(2,1, WTA_KT_Axes(), UnnormalizedMeasure(beta)); NsubjettinessRatio nSub32_beta1(3,2, WTA_KT_Axes(), UnnormalizedMeasure(beta)); // calculate Nsubjettiness values (beta = 1.0) double tau1_beta1 = nSub1_beta1(this_jet); double tau2_beta1 = nSub2_beta1(this_jet); double tau3_beta1 = nSub3_beta1(this_jet); double tau21_beta1 = nSub21_beta1(this_jet); double tau32_beta1 = nSub32_beta1(this_jet); // Output results (beta = 1.0) cout << setw(15) << 1.0 << setw(14) << tau1_beta1 << setw(14) << tau2_beta1 << setw(14) << tau3_beta1 << setw(14) << tau21_beta1 << setw(14) << tau32_beta1 << endl; // Repeat the above for beta = 2.0 // Define Nsubjettiness functions for beta = 2.0, using Half-KT axes beta = 2.0; Nsubjettiness nSub1_beta2(1, HalfKT_Axes(), UnnormalizedMeasure(beta)); Nsubjettiness nSub2_beta2(2, HalfKT_Axes(), UnnormalizedMeasure(beta)); Nsubjettiness nSub3_beta2(3, HalfKT_Axes(), UnnormalizedMeasure(beta)); NsubjettinessRatio nSub21_beta2(2,1, HalfKT_Axes(), UnnormalizedMeasure(beta)); NsubjettinessRatio nSub32_beta2(3,2, HalfKT_Axes(), UnnormalizedMeasure(beta)); // calculate Nsubjettiness values (beta = 2.0) double tau1_beta2 = nSub1_beta2(this_jet); double tau2_beta2 = nSub2_beta2(this_jet); double tau3_beta2 = nSub3_beta2(this_jet); double tau21_beta2 = nSub21_beta2(this_jet); double tau32_beta2 = nSub32_beta2(this_jet); // Output results (beta = 2.0) cout << setw(15) << 2.0 << setw(14) << tau1_beta2 << setw(14) << tau2_beta2 << setw(14) << tau3_beta2 << setw(14) << tau21_beta2 << setw(14) << tau32_beta2 << endl; // Additional information cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" << endl; cout << "Subjets found using beta = 1.0 tau values" << endl; PrintJets(nSub1_beta1.currentSubjets(),nSub1_beta1.currentTauComponents()); // these subjets have valid constituents cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintJets(nSub2_beta1.currentSubjets(),nSub2_beta1.currentTauComponents()); // these subjets have valid constituents cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintJets(nSub3_beta1.currentSubjets(),nSub3_beta1.currentTauComponents()); // these subjets have valid constituents cout << "-------------------------------------------------------------------------------------" << endl; cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" << endl; cout << "Axes used for above beta = 1.0 tau values" << endl; PrintJets(nSub1_beta1.currentAxes(),nSub1_beta1.currentTauComponents(),false); //PrintJets(nSub1_beta1.seedAxes()); // For one-pass minimization, this would show starting seeds cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintJets(nSub2_beta1.currentAxes(),nSub2_beta1.currentTauComponents(),false); //PrintJets(nSub2_beta1.seedAxes()); // For one-pass minimization, this would show starting seeds cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintJets(nSub3_beta1.currentAxes(),nSub3_beta1.currentTauComponents(),false); //PrintJets(nSub3_beta1.seedAxes()); // For one-pass minimization, this would show starting seeds cout << "-------------------------------------------------------------------------------------" << endl; cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" << endl; cout << "Subjets found using beta = 2.0 tau values" << endl; PrintJets(nSub1_beta2.currentSubjets(),nSub1_beta2.currentTauComponents()); // these subjets have valid constituents cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintJets(nSub2_beta2.currentSubjets(),nSub2_beta2.currentTauComponents()); // these subjets have valid constituents cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintJets(nSub3_beta2.currentSubjets(),nSub3_beta2.currentTauComponents()); // these subjets have valid constituents cout << "-------------------------------------------------------------------------------------" << endl; cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" << endl; cout << "Axes used for above beta = 2.0 tau values" << endl; PrintJets(nSub1_beta2.currentAxes(),nSub1_beta2.currentTauComponents(),false); cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintJets(nSub2_beta2.currentAxes(),nSub2_beta2.currentTauComponents(),false); cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintJets(nSub3_beta2.currentAxes(),nSub3_beta2.currentTauComponents(),false); cout << "-------------------------------------------------------------------------------------" << endl; } ////////// The XCone Jet Algorithm /////////////////////////// //////// // // We define a specific implementation of N-jettiness as a jet algorithm, which we call "XCone". // This is the recommended version for all users. // // Recommended usage of XConePlugin is with beta = 2.0 // Beta = 1.0 is also useful as a recoil-free variant in the face of pile-up. // /////// cout << "-------------------------------------------------------------------------------------" << endl; cout << "Using the XCone Jet Algorithm" << endl; cout << "-------------------------------------------------------------------------------------" << endl; // Jet radius to use throughout double R = 0.5; // Define the jet finding plugins for beta = 1.0 double beta = 1.0; // define the plugins XConePlugin xcone_plugin2_beta1(2, R, beta); XConePlugin xcone_plugin3_beta1(3, R, beta); XConePlugin xcone_plugin4_beta1(4, R, beta); // and the jet definitions JetDefinition xcone_jetDef2_beta1(&xcone_plugin2_beta1); JetDefinition xcone_jetDef3_beta1(&xcone_plugin3_beta1); JetDefinition xcone_jetDef4_beta1(&xcone_plugin4_beta1); // and the cluster sequences ClusterSequence xcone_seq2_beta1(input_particles, xcone_jetDef2_beta1); ClusterSequence xcone_seq3_beta1(input_particles, xcone_jetDef3_beta1); ClusterSequence xcone_seq4_beta1(input_particles, xcone_jetDef4_beta1); // and find the jets vector xcone_jets2_beta1 = xcone_seq2_beta1.inclusive_jets(); vector xcone_jets3_beta1 = xcone_seq3_beta1.inclusive_jets(); vector xcone_jets4_beta1 = xcone_seq4_beta1.inclusive_jets(); // Do exactly the same for beta = 2.0 (which is the default, so no argument needed) // define the plugins XConePlugin xcone_plugin2_beta2(2, R); XConePlugin xcone_plugin3_beta2(3, R); XConePlugin xcone_plugin4_beta2(4, R); // and the jet definitions JetDefinition xcone_jetDef2_beta2(&xcone_plugin2_beta2); JetDefinition xcone_jetDef3_beta2(&xcone_plugin3_beta2); JetDefinition xcone_jetDef4_beta2(&xcone_plugin4_beta2); // and the cluster sequences ClusterSequence xcone_seq2_beta2(input_particles, xcone_jetDef2_beta2); ClusterSequence xcone_seq3_beta2(input_particles, xcone_jetDef3_beta2); ClusterSequence xcone_seq4_beta2(input_particles, xcone_jetDef4_beta2); // and find the jets vector xcone_jets2_beta2 = xcone_seq2_beta2.inclusive_jets(); vector xcone_jets3_beta2 = xcone_seq3_beta2.inclusive_jets(); vector xcone_jets4_beta2 = xcone_seq4_beta2.inclusive_jets(); cout << "-------------------------------------------------------------------------------------" << endl; cout << "Using beta = " << setprecision(2) << 1.0 << ", R = " << setprecision(2) << R << endl; cout << "-------------------------------------------------------------------------------------" << endl; PrintXConeJets(xcone_jets2_beta1); cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintXConeJets(xcone_jets3_beta1); cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintXConeJets(xcone_jets4_beta1); // The axes might point in a different direction than the jets // Using the njettiness_extras pointer (ClusterSequence::Extras) to access that information vector xcone_axes2_beta1 = njettiness_extras(xcone_seq2_beta1)->axes(); vector xcone_axes3_beta1 = njettiness_extras(xcone_seq3_beta1)->axes(); vector xcone_axes4_beta1 = njettiness_extras(xcone_seq4_beta1)->axes(); cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" << endl; cout << "Axes Used for Above Jets" << endl; PrintXConeAxes(xcone_axes2_beta1); cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintXConeAxes(xcone_axes3_beta1); cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintXConeAxes(xcone_axes4_beta1); cout << "-------------------------------------------------------------------------------------" << endl; cout << "Using beta = " << setprecision(2) << 2.0 << ", R = " << setprecision(2) << R << endl; cout << "-------------------------------------------------------------------------------------" << endl; PrintXConeJets(xcone_jets2_beta2); cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintXConeJets(xcone_jets3_beta2); cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintXConeJets(xcone_jets4_beta2); // The axes might point in a different direction than the jets // Using the njettiness_extras pointer (ClusterSequence::Extras) to access that information vector xcone_axes2_beta2 = njettiness_extras(xcone_seq2_beta2)->axes(); vector xcone_axes3_beta2 = njettiness_extras(xcone_seq3_beta2)->axes(); vector xcone_axes4_beta2 = njettiness_extras(xcone_seq4_beta2)->axes(); cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" << endl; cout << "Axes Used for Above Jets" << endl; PrintXConeAxes(xcone_axes2_beta2); cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintXConeAxes(xcone_axes3_beta2); cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintXConeAxes(xcone_axes4_beta2); bool calculateArea = false; if (calculateArea) { cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" << endl; cout << "Adding Area Information for beta = 2.0 (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 xcone_seq_area2(input_particles, xcone_jetDef2_beta2, area_def); ClusterSequenceArea xcone_seq_area3(input_particles, xcone_jetDef3_beta2, area_def); ClusterSequenceArea xcone_seq_area4(input_particles, xcone_jetDef4_beta2, area_def); vector xcone_jets_area2 = xcone_seq_area2.inclusive_jets(); vector xcone_jets_area3 = xcone_seq_area3.inclusive_jets(); vector xcone_jets_area4 = xcone_seq_area4.inclusive_jets(); PrintXConeJets(xcone_jets_area2); cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintXConeJets(xcone_jets_area3); cout << "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl; PrintXConeJets(xcone_jets_area4); } cout << "-------------------------------------------------------------------------------------" << endl; cout << "Done Using the XCone Jet Algorithm" << endl; cout << "-------------------------------------------------------------------------------------" << endl; } void PrintJets(const vector & jets, const TauComponents & components, bool showTotal) { string commentStr = ""; // gets extras information if (jets.size() == 0) return; // For printing out component tau information vector subTaus = components.jet_pieces(); double totalTau = components.tau(); 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(13) << tauName; if (useArea) cout << setw(10) << "area"; cout << endl; // 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 (jets[i].has_constituents()) cout << setprecision(4) << setw(11) << jets[i].constituents().size(); cout << setprecision(6) << setw(13) << max(subTaus[i],0.0); if (useArea) cout << setprecision(4) << setw(10) << (jets[i].has_area() ? jets[i].area() : 0.0 ); cout << endl; } // print out total jet if (showTotal) { fastjet::PseudoJet total = join(jets); 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.constituents().size(); cout << setprecision(6) << setw(13) << totalTau; if (useArea) cout << setprecision(4) << setw(10) << (total.has_area() ? total.area() : 0.0); cout << endl; } } void PrintXConeJets(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 PrintXConeAxes(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; } }