High-pT Boson Tagger



Tracking New Physics at the LHC and beyond

M.Spannowsky and M.Stoll

Phys. Rev. D 92 (2015) 054033

arxiv: 1505.01921


The HPTEWBTagger algorithm reconstructs hadronically decaying top quarks and is specifically designed for high top quark transverse momentum (>1TeV) where calorimeter granularity prevents the separate detection of the individual decay products.

The HPTEWBTagger uses tracks of charged particles (or a combination between E-cal and tracks) inside a fat jet. The tracking information is complemented by the calorimeter measurement (Hcal + Ecal + tracks) of the fat jet energy to eliminate the sensitivity to jet-to-jet fluctuations in the charged-to-neutral particle ratio.

The algorithm is based on FastJet jets and their respective cluster sequences.

Source Code

You can download the source code here.

In case you have questions please get in touch with us,

Martin and Michael

Usage Example:

// get fat jets from calorimeter information (charged and neutral particles)

double R=0.5;

double ptmin_jet = 500.0;

fastjet::JetDefinition jet_def(fastjet::cambridge_algorithm, R);

fastjet::ClusterSequence clust_seq(calo_cells, jet_def);

vector<fastjet::PseudoJet> jets = sorted_by_pt(clust_seq.inclusive_jets(ptmin_jet));

// jets[0] is the leading pT calorimeter fat jet

// create a corresponding fat jet from the associated tracks (can include Ecal information)

vector<fastjet::PseudoJet> fatjet_constituents = clust_seq->constituents( jets[0] );

charged_constituents = ... // use ghost association (PDG ID) to identify tracks (charged particles)

  fastjet::JetDefinition jet_def_charged(fastjet::cambridge_algorithm, 2*R);

fastjet::ClusterSequence clust_seq_c(charged_constituents, jet_def_charged);

vector<fastjet::PseudoJet> charged_jet = sorted_by_pt(clust_seq_c.inclusive_jets());

// charged_jet[0] corresponds to jets[0] but contains only the associated tracks (charged particles)

// search for a W candidate with the HPTEWBTagger

HPTWTagger hptwtag(clust_seq_c, charged_jet[0], clust_seq, jets[0]);




if ( hptwtag.is_maybe_w() ) {

  // W candidate is within mass window

  if ( hptwtag.is_tagged() ) {

    // W candidate satisfies all cuts

    PseudoJet candidate = hptwtag.w_candidate();



// or search for a Z candidate with the HPTEWBTagger

HPTZTagger hptztag(clust_seq_c, charged_jet[0], clust_seq, jets[0]);


hptztag.set_working_point_2(); // optional: use less strict cuts



if ( hptztag.is_maybe_z() ) {

  // Z candidate is within mass window

  if ( hptztag.is_tagged() ) {

    // Z candidate satisfies all cuts

    PseudoJet candidate = hptztag.z_candidate();