fastjet_boosted_higgs.cc File Reference

#include "fastjet/ClusterSequence.hh"
#include <iostream>
#include <sstream>
#include <iomanip>
#include <cmath>
Include dependency graph for fastjet_boosted_higgs.cc:

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 Documentation

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.


Function Documentation

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.

00217                                                         {
00218   ostr << "pt, y, phi =" 
00219        << " " << setw(10) << jet.perp() 
00220        << " " << setw(6) <<  jet.rap()  
00221        << " " << setw(6) <<  jet.phi()  
00222        << ", mass = " << setw(10) << jet.m()
00223        << ", btag = " << jet.user_index();
00224   return ostr;
00225 }


Generated on 26 Feb 2010 for fastjet by  doxygen 1.6.1