#include "fastjet/ClusterSequence.hh"
#include <iostream>
#include <sstream>
#include <iomanip>
#include <cmath>
Go to the source code of this file.
Classes | |
class | FlavourRecombiner |
Typedefs | |
typedef fj::JetDefinition::DefaultRecombiner | DefRecomb |
set up a class to give standard (by default E-scheme) recombination, with additional tracking of flavour information in the user_index. | |
Functions | |
ostream & | operator<< (ostream &, fj::PseudoJet &) |
forward declaration for printing out info about a jet | |
int | main (int argc, char **argv) |
typedef fj::JetDefinition::DefaultRecombiner DefRecomb |
set up a class to give standard (by default E-scheme) recombination, with additional tracking of flavour information in the user_index.
If you use this, you must explicitly set the user index to 0 for non-flavoured particles (the default value is -1);
This will work for native algorithms, but not for all plugins
Definition at line 73 of file fastjet_boosted_higgs.cc.
int main | ( | int | argc, | |
char ** | argv | |||
) |
now do the subjet decomposition;
when unpeeling a C/A jet, often only a very soft piece may break off; the mass_drop_threshold indicates how much "lighter" the heavier of the two resulting pieces must be in order for us to consider that we've really seen some form of substructure
QCD backgrounds that give larger jet masses have a component where a quite soft gluon is emitted; to eliminate part of this one can place a cut on the asymmetry of the branching;
Here the cut is expressed in terms of y, the kt-distance scaled to the squared jet mass; an easier way to see it is in terms of a requirement on the momentum fraction in the splitting: z/(1-z) and (1-z)/z > rtycut^2 [the correspondence holds only at LO]
Definition at line 98 of file fastjet_boosted_higgs.cc.
References cambridge_algorithm, fastjet::d0::inline_maths::min(), and sorted_by_pt().
00098 { 00099 00100 vector<fj::PseudoJet> particles; 00101 00102 // read in data in format px py pz E b-tag [last of these is optional] 00103 string line; 00104 while (getline(cin,line)) { 00105 if (line.substr(0,1) == "#") {continue;} 00106 istringstream linestream(line); 00107 double px,py,pz,E; 00108 linestream >> px >> py >> pz >> E; 00109 00110 // optionally read in btag information 00111 int btag; 00112 if (! (linestream >> btag)) btag = 0; 00113 00114 // construct the particle 00115 fj::PseudoJet particle(px,py,pz,E); 00116 particle.set_user_index(btag); // btag info goes in user index, for flavour tracking 00117 particles.push_back(particle); 00118 } 00119 00120 00121 // set up the jet finding 00122 double R = 1.2; 00123 FlavourRecombiner flav_recombiner; // for tracking flavour 00124 fj::JetDefinition jet_def(fj::cambridge_algorithm, R, &flav_recombiner); 00125 00126 00127 // run the jet finding; find the hardest jet 00128 fj::ClusterSequence cs(particles, jet_def); 00129 vector<fj::PseudoJet> jets = sorted_by_pt(cs.inclusive_jets()); 00130 00131 00132 cout << "Ran: " << jet_def.description() << endl << endl; 00133 cout << "Hardest jet: " << jets[0] << endl << endl; 00134 00135 00137 // 00142 double mass_drop_threshold = 0.667; 00151 double rtycut = 0.3; 00152 00153 fj::PseudoJet this_jet = jets[0], parent1, parent2; 00154 bool had_parents; 00155 00156 while ((had_parents = cs.has_parents(this_jet,parent1,parent2))) { 00157 // make parent1 the more massive jet 00158 if (parent1.m() < parent2.m()) swap(parent1,parent2); 00159 // 00160 // if we pass the conditions on the mass drop and its degree of 00161 // asymmetry (z/(1-z) \sim kt_dist/m^2 > rtycut), then we've found 00162 // something interesting, so exit the loop 00163 if (parent1.m() < mass_drop_threshold * this_jet.m() && 00164 parent1.kt_distance(parent2) > pow(rtycut,2) * this_jet.m2()) { 00165 break; 00166 } else { 00167 // otherwise try a futher decomposition on the more massive jet 00168 this_jet = parent1; 00169 } 00170 } 00171 00172 // look to see what we found 00173 if (had_parents) { 00174 cout << "Found suitable pair of subjets: " << endl; 00175 cout << " " << parent1 << endl; 00176 cout << " " << parent2 << endl; 00177 cout << "Total = " << endl; 00178 cout << " " << this_jet << endl << endl; 00179 00180 // next we "filter" it, to remove UE & pileup contamination 00181 // 00182 // [there are two ways of doing this; here we directly use the 00183 // exsiting cluster sequence and find the exclusive subjets of 00184 // this_jet (i.e. work backwards within the cs starting from 00185 // this_jet); alternatively one can recluster just the 00186 // constituents of the jet] 00187 // 00188 // first get separation between the subjets (called Rbb -- assuming it's a Higgs!) 00189 double Rbb = sqrt(parent1.squared_distance(parent2)); 00190 double Rfilt = min(Rbb/2, 0.3); // somewhat arbitrary choice 00191 unsigned nfilt = 3; // number of pieces we'll take 00192 cout << "Subjet separation (Rbb) = " << Rbb << ", Rfilt = " << Rfilt << endl; 00193 00194 double dcut = pow(Rfilt/R,2); // for C/A get a view at Rfilt by 00195 // using a dcut=(Rfilt/R)^2 00196 vector<fj::PseudoJet> filt_subjets = sorted_by_pt(cs.exclusive_subjets(this_jet, dcut)); 00197 00198 // now print out the filtered jets and reconstruct total 00199 // at the same time 00200 cout << "Filtered pieces are " << endl; 00201 cout << " " << filt_subjets[0] << endl; 00202 fj::PseudoJet filtered_total = filt_subjets[0]; 00203 for (unsigned i = 1; i < nfilt && i < filt_subjets.size(); i++) { 00204 cout << " " << filt_subjets[i] << endl; 00205 flav_recombiner.plus_equal(filtered_total, filt_subjets[i]); 00206 } 00207 cout << "Filtered total is " << endl; 00208 cout << " " << filtered_total << endl; 00209 00210 } else { 00211 cout << "Did not find suitable hard substructure in this event." << endl; 00212 } 00213 }
ostream & operator<< | ( | ostream & | ostr, | |
fj::PseudoJet & | jet | |||
) |
forward declaration for printing out info about a jet
does the actual work for printing out a jet
Definition at line 217 of file fastjet_boosted_higgs.cc.