22 #include "fastjet/tools/Recluster.hh"    23 #include "fastjet/CompositeJetStructure.hh"    24 #include <fastjet/ClusterSequenceActiveAreaExplicitGhosts.hh>    46 FASTJET_BEGIN_NAMESPACE      
    48 LimitedWarning Recluster::_explicit_ghost_warning;
    53     _acquire_recombiner(true), _keep(keep_in), _cambridge_optimisation_enabled(true){}
    56     : _acquire_recombiner(true), _keep(keep_in), _cambridge_optimisation_enabled(true){
    69   ostr << 
"Recluster with new_jet_def = ";
    70   if (_acquire_recombiner){
    72     ostr << 
", using a recombiner obtained from the jet being reclustered";
    78     ostr << 
" and keeping the hardest inclusive jet";
    80     ostr << 
" and joining all inclusive jets into a composite jet";
    90   vector<PseudoJet> incljets;
   109                                      vector<PseudoJet> & output_jets)
 const{
   114     throw Error(
"Recluster can only be applied on jets having constituents");
   125   vector<PseudoJet> all_pieces;
   126   if ((!_get_all_pieces(input_jet, all_pieces)) || (all_pieces.size()==0)){
   127     throw Error(
"Recluster: failed to retrieve all the pieces composing the jet.");
   133   if (_acquire_recombiner){
   134     _acquire_recombiner_from_pieces(all_pieces, new_jet_def);
   152   if (_check_ca(all_pieces, new_jet_def)){
   153     _recluster_ca(all_pieces, output_jets, new_jet_def.R());
   160   bool include_area_support = input_jet.
has_area();
   161   if ((include_area_support) &&  (!_check_explicit_ghosts(all_pieces))){
   162     _explicit_ghost_warning.
warn(
"Recluster: the original cluster sequence is lacking explicit ghosts; area support will no longer be available after re-clustering");
   163     include_area_support = 
false;
   168   _recluster_generic(input_jet, output_jets, new_jet_def, include_area_support);
   177                                          bool ca_optimisation_used)
 const{
   180     if (incljets.size() > 0) {
   190   if (incljets.size()==0) 
return join(incljets);
   193                                *(incljets[0].associated_cluster_sequence()->jet_def().recombiner()));
   199   if (ca_optimisation_used){
   201         (incljets.size() > 0) &&
   202         (! incljets[0].validated_csab()->has_explicit_ghosts())){
   217 void Recluster::_recluster_ca(
const vector<PseudoJet> & all_pieces, 
   218                               vector<PseudoJet> & subjets, 
   224   for (vector<PseudoJet>::const_iterator piece_it = all_pieces.begin(); 
   225        piece_it!=all_pieces.end(); piece_it++){
   228     vector<PseudoJet> local_subjets;
   230     double dcut = Rfilt / cs->
jet_def().R();
   236       local_subjets.push_back(*piece_it);
   238       local_subjets = piece_it->exclusive_subjets(dcut*dcut);
   241     copy(local_subjets.begin(), local_subjets.end(), back_inserter(subjets));
   248 void Recluster::_recluster_generic(
const PseudoJet & jet, 
   249                                    vector<PseudoJet> & incljets,
   251                                    bool do_areas)
 const{
   265     vector<PseudoJet> regular_constituents, ghosts;  
   271     double ghost_area = (ghosts.size()) ? ghosts[0].area() : 0.01;
   313 bool Recluster::_get_all_pieces(
const PseudoJet &jet, vector<PseudoJet> &all_pieces)
 const{
   315     all_pieces.push_back(jet);
   320     const vector<PseudoJet> pieces = jet.
pieces();
   321     for (vector<PseudoJet>::const_iterator it=pieces.begin(); it!=pieces.end(); it++)
   322       if (!_get_all_pieces(*it, all_pieces)) 
return false;
   332 void Recluster::_acquire_recombiner_from_pieces(
const vector<PseudoJet> &all_pieces, 
   335   assert(_acquire_recombiner);
   342   const JetDefinition & jd_ref = all_pieces[0].validated_cs()->jet_def();
   343   for (
unsigned int i=1; i<all_pieces.size(); i++){
   344     if (!all_pieces[i].validated_cs()->jet_def().has_same_recombiner(jd_ref)){
   345       throw Error(
"Recluster instance is configured to determine the recombination scheme (or recombiner) from the original jet, but different pieces of the jet were found to have non-equivalent recombiners.");
   362 bool Recluster::_check_explicit_ghosts(
const vector<PseudoJet> &all_pieces)
 const{
   363   for (vector<PseudoJet>::const_iterator it=all_pieces.begin(); it!=all_pieces.end(); it++)
   364     if (! it->validated_csab()->has_explicit_ghosts()) 
return false;
   383 bool Recluster::_check_ca(
const vector<PseudoJet> &all_pieces, 
   386   if (!_cambridge_optimisation_enabled) 
return false;
   396   for (
unsigned int i=1; i<all_pieces.size(); i++)
   397     if (all_pieces[i].validated_cs() != cs_ref) 
return false;
   406   double Rnew2 = new_jet_def.R();
   408   for (
unsigned int i=0; i<all_pieces.size()-1; i++){
   409     for (
unsigned int j=i+1; j<all_pieces.size(); j++){
   410       if (all_pieces[i].squared_distance(all_pieces[j]) <  Rnew2) 
return false;
   417 FASTJET_END_NAMESPACE      
 const JetDefinition & jet_def() const
return a reference to the jet definition 
 
JetAlgorithm jet_algorithm() const
return information about the definition... 
 
vector< PseudoJet > sorted_by_pt(const vector< PseudoJet > &jets)
return a vector of jets sorted into decreasing kt2 
 
virtual bool has_area() const
check if it has a defined area 
 
bool has_associated_cluster_sequence() const
returns true if this PseudoJet has an associated ClusterSequence. 
 
virtual PseudoJet result(const PseudoJet &jet) const
runs the reclustering and sets kept and rejected to be the jets of interest (with non-zero rho...
 
std::string description_no_recombiner() const
returns a description not including the recombiner information 
 
PseudoJetStructureBase * structure_non_const_ptr()
return a non-const pointer to the structure (of type PseudoJetStructureBase*) associated with this Ps...
 
std::vector< PseudoJet > inclusive_jets(const double ptmin=0.0) const
return a vector of all jets (in the sense of the inclusive algorithm) with pt >= ptmin. 
 
static std::string algorithm_description(const JetAlgorithm jet_alg)
a short textual description of the algorithm jet_alg 
 
The structure for a jet made of pieces. 
 
void warn(const char *warning)
outputs a warning to standard error (or the user's default warning stream if set) ...
 
virtual bool has_pieces() const
returns true if a jet has pieces 
 
keep only the hardest inclusive jet and return a "standard" jet with an associated ClusterSequence [t...
 
Keep
the various options for the output of Recluster 
 
virtual std::vector< PseudoJet > constituents() const
retrieve the constituents. 
 
virtual std::vector< PseudoJet > pieces() const
retrieve the pieces that make up the jet. 
 
base class corresponding to errors that can be thrown by FastJet 
 
Like ClusterSequence with computation of the active jet area with the addition of explicit ghosts...
 
PseudoJet generate_output_jet(std::vector< PseudoJet > &incljets, bool ca_optimisation_used) const
given a set of inclusive jets and a jet definition used, create the resulting PseudoJet; ...
 
static const double max_allowable_R
R values larger than max_allowable_R are not allowed. 
 
virtual bool has_constituents() const
returns true if the PseudoJet has constituents 
 
void discard_area()
disable the area of the composite jet 
 
void sift(const std::vector< PseudoJet > &jets, std::vector< PseudoJet > &jets_that_pass, std::vector< PseudoJet > &jets_that_fail) const
sift the input jets into two vectors – those that pass the selector and those that do not ...
 
static unsigned int n_parameters_for_algorithm(const JetAlgorithm jet_alg)
the number of parameters associated to a given jet algorithm 
 
bool get_new_jets_and_def(const PseudoJet &input_jet, std::vector< PseudoJet > &output_jets) const
A lower-level method that does the actual work of reclustering the input jet. 
 
void set_recombiner(const Recombiner *recomb)
set the recombiner class to the one provided 
 
the longitudinally invariant variant of the cambridge algorithm (aka Aachen algoithm). 
 
bool has_same_recombiner(const JetDefinition &other_jd) const
returns true if the current jet definitions shares the same recombiner as the one passed as an argume...
 
Selector SelectorIsPureGhost()
select objects that are (or are only made of) ghosts. 
 
std::string description() const
return a textual description of the current jet definition 
 
JetAlgorithm
the various families of jet-clustering algorithm 
 
void delete_self_when_unused()
by calling this routine you tell the ClusterSequence to delete itself when all the Pseudojets associa...
 
Class to contain pseudojets, including minimal information of use to jet-clustering routines...
 
Recluster()
default constructor (uses an undefined JetDefinition, and so cannot be used directly). 
 
class that is intended to hold a full definition of the jet clusterer 
 
virtual std::string description() const
class description