1 #ifndef __FASTJET_CLUSTERSEQUENCE_HH__ 2 #define __FASTJET_CLUSTERSEQUENCE_HH__ 37 #include "fastjet/PseudoJet.hh" 44 #include "fastjet/Error.hh" 45 #include "fastjet/JetDefinition.hh" 46 #include "fastjet/SharedPtr.hh" 47 #include "fastjet/LimitedWarning.hh" 48 #include "fastjet/FunctionOfPseudoJet.hh" 49 #include "fastjet/ClusterSequenceStructure.hh" 51 #include "fastjet/internal/deprecated.hh" 53 FASTJET_BEGIN_NAMESPACE
57 class ClusterSequenceStructure;
58 class DynamicNearestNeighbours;
75 const std::vector<L> & pseudojets,
77 const bool & writeout_combinations =
false);
81 transfer_from_sequence(cs);
98 std::vector<PseudoJet> inclusive_jets (
const double ptmin = 0.0)
const;
103 int n_exclusive_jets (
const double dcut)
const;
108 std::vector<PseudoJet> exclusive_jets (
const double dcut)
const;
115 std::vector<PseudoJet> exclusive_jets (
const int njets)
const;
122 std::vector<PseudoJet> exclusive_jets_up_to (
const int njets)
const;
127 double exclusive_dmerge (
const int njets)
const;
133 double exclusive_dmerge_max (
const int njets)
const;
147 int njets = n_exclusive_jets_ycut(ycut);
148 return exclusive_jets(njets);
162 std::vector<PseudoJet> exclusive_subjets (
const PseudoJet & jet,
163 const double dcut)
const;
168 int n_exclusive_subjets(
const PseudoJet & jet,
169 const double dcut)
const;
176 std::vector<PseudoJet> exclusive_subjets (
const PseudoJet & jet,
184 std::vector<PseudoJet> exclusive_subjets_up_to (
const PseudoJet & jet,
191 double exclusive_subdmerge(
const PseudoJet & jet,
int nsub)
const;
198 double exclusive_subdmerge_max(
const PseudoJet & jet,
int nsub)
const;
205 double Q()
const {
return _Qtot;}
207 double Q2()
const {
return _Qtot*_Qtot;}
244 std::vector<PseudoJet> constituents (
const PseudoJet & jet)
const;
255 void print_jets_for_root(
const std::vector<PseudoJet> & jets,
256 std::ostream & ostr = std::cout)
const;
260 void print_jets_for_root(
const std::vector<PseudoJet> & jets,
261 const std::string & filename,
262 const std::string & comment =
"")
const;
269 void add_constituents (
const PseudoJet & jet,
270 std::vector<PseudoJet> & subjet_vector)
const;
279 std::string strategy_string (
Strategy strategy_in)
const;
296 void delete_self_when_unused();
303 void signal_imminent_self_deletion()
const;
309 double jet_scale_for_algorithm(
const PseudoJet & jet)
const;
323 assert(plugin_activated());
324 _do_ij_recombination_step(jet_i, jet_j, dij, newjet_k);
330 void plugin_record_ij_recombination(
int jet_i,
int jet_j,
double dij,
339 assert(plugin_activated());
340 _do_iB_recombination_step(jet_i, diB);
353 virtual std::string description()
const {
return "This is a dummy extras class that contains no extra information! Derive from it if you want to use it to provide extra information from a plugin jet finder";}
361 _extras.reset(extras_in);
370 #ifdef FASTJET_HAVE_AUTO_PTR_INTERFACE 371 FASTJET_DEPRECATED_MSG(
"Please use ClusterSequence::plugin_associate_extras(Extras * extras_in)) instead")
372 inline
void plugin_associate_extras(
std::auto_ptr<
Extras> extras_in){
373 _extras.reset(extras_in.release());
392 assert(plugin_activated());
393 _simple_N2_cluster<GBJ>();
441 enum JetType {Invalid=-3, InexistentParent = -2, BeamJet = -1};
459 const std::vector<PseudoJet> & jets()
const;
472 const std::vector<history_element> & history()
const;
478 unsigned int n_particles()
const;
484 std::vector<int> particle_jet_indices(
const std::vector<PseudoJet> &)
const;
501 std::vector<int> unique_history_order()
const;
506 std::vector<PseudoJet> unclustered_particles()
const;
512 std::vector<PseudoJet> childless_pseudojets()
const;
519 bool contains(
const PseudoJet &
object)
const;
538 return _structure_shared_ptr;
551 static void print_banner();
566 static void set_fastjet_banner_stream(std::ostream * ostr) {_fastjet_banner_ostr = ostr;}
580 static std::ostream * _fastjet_banner_ostr;
590 template<
class L>
void _transfer_input_jets(
591 const std::vector<L> & pseudojets);
597 const bool & writeout_combinations);
603 void _initialise_and_run_no_decant();
615 const bool & writeout_combinations);
621 void _decant_options_partial();
626 void _fill_initial_history();
631 void _do_ij_recombination_step(
const int jet_i,
const int jet_j,
632 const double dij,
int & newjet_k);
636 void _do_iB_recombination_step(
const int jet_i,
const double diB);
643 void _set_structure_shared_ptr(
PseudoJet & j);
647 void _update_structure_use_count();
661 _Parabola(
double a,
double b,
double c) : _a(a), _b(b), _c(c) {}
662 inline double operator()(
const double R)
const {
return _c*(_a*R*R + _b*R + 1);}
673 _Line(
double a,
double b) : _a(a), _b(b) {}
674 inline double operator()(
const double R)
const {
return _a*R + _b;}
698 void get_subhist_set(std::set<const history_element*> & subhist,
699 const PseudoJet & jet,
double dcut,
int maxjet)
const;
701 bool _writeout_combinations;
703 double _Rparam, _R2, _invR2;
709 int _structure_use_count_after_construction;
718 bool _plugin_activated;
721 void _really_dumb_cluster ();
722 void _delaunay_cluster ();
724 template<
class BJ>
void _simple_N2_cluster ();
725 void _tiled_N2_cluster ();
726 void _faster_tiled_N2_cluster ();
729 void _minheap_faster_tiled_N2_cluster();
733 void _CP2DChan_cluster();
734 void _CP2DChan_cluster_2pi2R ();
735 void _CP2DChan_cluster_2piMultD ();
736 void _CP2DChan_limited_cluster(
double D);
737 void _do_Cambridge_inclusive_jets();
740 void _fast_NsqrtN_cluster();
742 void _add_step_to_history(
744 const int parent2,
const int jetp_index,
749 void _extract_tree_children(
int pos, std::valarray<bool> &,
750 const std::valarray<int> &, std::vector<int> &)
const;
754 void _extract_tree_parents (
int pos, std::valarray<bool> &,
755 const std::valarray<int> &, std::vector<int> &)
const;
759 typedef std::pair<int,int> TwoVertices;
760 typedef std::pair<double,TwoVertices> DijEntry;
761 typedef std::multimap<double,TwoVertices> DistMap;
764 void _add_ktdistance_to_map(
const int ii,
766 const DynamicNearestNeighbours * DNN);
770 static bool _first_time;
786 double eta, phi, kt2, NN_dist;
795 double eta, phi, kt2, NN_dist;
796 TiledJet * NN, *previous, * next;
797 int _jets_index, tile_index, diJ_posn;
802 inline void label_minheap_update_needed() {diJ_posn = 1;}
803 inline void label_minheap_update_done() {diJ_posn = 0;}
804 inline bool minheap_update_needed()
const {
return diJ_posn==1;}
812 template <
class J>
void _bj_set_jetinfo( J *
const jet,
813 const int _jets_index)
const;
817 void _bj_remove_from_tiles( TiledJet *
const jet)
const;
820 template <
class J>
double _bj_dist(
const J *
const jeta,
821 const J *
const jetb)
const;
825 template <
class J>
double _bj_diJ(
const J *
const jeta)
const;
830 template <
class J>
inline J * _bj_of_hindex(
831 const int hist_index,
832 J *
const head, J *
const tail)
835 for(res = head; res<tail; res++) {
836 if (_jets[res->_jets_index].cluster_hist_index() == hist_index) {
break;}
849 template <
class J>
void _bj_set_NN_nocross(J *
const jeta,
850 J *
const head,
const J *
const tail)
const;
856 template <
class J>
void _bj_set_NN_crosscheck(J *
const jeta,
857 J *
const head,
const J *
const tail)
const;
863 static const int n_tile_neighbours = 9;
869 Tile * begin_tiles[n_tile_neighbours];
871 Tile ** surrounding_tiles;
881 std::vector<Tile> _tiles;
882 double _tiles_eta_min, _tiles_eta_max;
883 double _tile_size_eta, _tile_size_phi;
884 int _n_tiles_phi,_tiles_ieta_min,_tiles_ieta_max;
888 inline int _tile_index (
int ieta,
int iphi)
const {
891 return (ieta-_tiles_ieta_min)*_n_tiles_phi
892 + (iphi+_n_tiles_phi) % _n_tiles_phi;
897 int _tile_index(
const double eta,
const double phi)
const;
898 void _tj_set_jetinfo ( TiledJet *
const jet,
const int _jets_index);
899 void _bj_remove_from_tiles(TiledJet *
const jet);
900 void _initialise_tiles();
901 void _print_tiles(TiledJet * briefjets )
const;
902 void _add_neighbours_to_tile_union(
const int tile_index,
903 std::vector<int> & tile_union,
int & n_near_tiles)
const;
904 void _add_untagged_neighbours_to_tile_union(
const int tile_index,
905 std::vector<int> & tile_union,
int & n_near_tiles);
923 void _simple_N2_cluster_BriefJet();
925 void _simple_N2_cluster_EEBriefJet();
936 template<
class L>
void ClusterSequence::_transfer_input_jets(
937 const std::vector<L> & pseudojets) {
941 _jets.reserve(pseudojets.size()*2);
947 for (
unsigned int i = 0; i < pseudojets.size(); i++) {
948 _jets.push_back(pseudojets[i]);}
972 template<
class L> ClusterSequence::ClusterSequence (
973 const std::vector<L> & pseudojets,
975 const bool & writeout_combinations) :
976 _jet_def(jet_def_in), _writeout_combinations(writeout_combinations),
987 _initialise_and_run_no_decant();
1012 std::vector<PseudoJet>
jets;
1013 if (is_spherical()) {
1021 if (jets.size() != 0) {
1033 template <
class J>
inline void ClusterSequence::_bj_set_jetinfo(
1034 J *
const jetA,
const int _jets_index)
const {
1035 jetA->eta =
_jets[_jets_index].rap();
1036 jetA->phi =
_jets[_jets_index].phi_02pi();
1038 jetA->_jets_index = _jets_index;
1040 jetA->NN_dist = _R2;
1048 template <
class J>
inline double ClusterSequence::_bj_dist(
1049 const J *
const jetA,
const J *
const jetB)
const {
1051 #ifndef FASTJET_NEW_DELTA_PHI 1053 double dphi = std::abs(jetA->phi - jetB->phi);
1054 double deta = (jetA->eta - jetB->eta);
1055 if (dphi > pi) {dphi = twopi - dphi;}
1058 double dphi = pi-std::abs(pi-std::abs(jetA->phi - jetB->phi));
1059 double deta = (jetA->eta - jetB->eta);
1061 return dphi*dphi + deta*deta;
1065 template <
class J>
inline double ClusterSequence::_bj_diJ(
const J *
const jet)
const {
1066 double kt2 = jet->kt2;
1067 if (jet->NN != NULL) {
if (jet->NN->kt2 < kt2) {kt2 = jet->NN->kt2;}}
1068 return jet->NN_dist * kt2;
1075 template <
class J>
inline void ClusterSequence::_bj_set_NN_nocross(
1076 J *
const jet, J *
const head,
const J *
const tail)
const {
1077 double NN_dist = _R2;
1080 for (J * jetB = head; jetB != jet; jetB++) {
1081 double dist = _bj_dist(jet,jetB);
1082 if (dist < NN_dist) {
1089 for (J * jetB = jet+1; jetB != tail; jetB++) {
1090 double dist = _bj_dist(jet,jetB);
1091 if (dist < NN_dist) {
1098 jet->NN_dist = NN_dist;
1103 template <
class J>
inline void ClusterSequence::_bj_set_NN_crosscheck(J *
const jet,
1104 J *
const head,
const J *
const tail)
const {
1105 double NN_dist = _R2;
1107 for (J * jetB = head; jetB != tail; jetB++) {
1108 double dist = _bj_dist(jet,jetB);
1109 if (dist < NN_dist) {
1113 if (dist < jetB->NN_dist) {
1114 jetB->NN_dist = dist;
1119 jet->NN_dist = NN_dist;
1122 FASTJET_END_NAMESPACE
1124 #endif // __FASTJET_CLUSTERSEQUENCE_HH__ const JetDefinition & jet_def() const
return a reference to the jet definition
ClusterSequenceStructure StructureType
the structure type associated with a jet belonging to a ClusterSequence
double exclusive_ymerge(int njets) const
return the ymin corresponding to the recombination that went from n+1 to n jets (sometimes known as y...
void plugin_associate_extras(Extras *extras_in)
the plugin can associate some extra information with the ClusterSequence object by calling this funct...
void _transfer_input_jets(const std::vector< L > &pseudojets)
transfer the vector<L> of input jets into our own vector<PseudoJet> _jets (with some reserved space f...
vector< PseudoJet > sorted_by_pt(const vector< PseudoJet > &jets)
return a vector of jets sorted into decreasing kt2
const Extras * extras() const
returns a pointer to the extras object (may be null)
const std::vector< history_element > & history() const
allow the user to access the raw internal history.
void plugin_simple_N2_cluster()
allows a plugin to run a templated clustering (nearest-neighbour heuristic)
ClusterSequence()
default constructor
ClusterSequence(const ClusterSequence &cs)
copy constructor for a ClusterSequence
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.
int jetp_index
index in _history where the current jet is recombined with another jet to form its child...
double Q() const
returns the sum of all energies in the event (relevant mainly for e+e-)
double Q2() const
return Q()^2
Contains any information related to the clustering that should be directly accessible to PseudoJet...
void plugin_record_ij_recombination(int jet_i, int jet_j, double dij, int &newjet_k)
record the fact that there has been a recombination between jets()[jet_i] and jets()[jet_k], with the specified dij, and return the index (newjet_k) allocated to the new jet, whose momentum is assumed to be the 4-vector sum of that of jet_i and jet_j
std::vector< PseudoJet > _jets
This contains the physical PseudoJets; for each PseudoJet one can find the corresponding position in ...
std::vector< history_element > _history
this vector will contain the branching history; for each stage, _history[i].jetp_index indicates wher...
bool plugin_activated() const
returns true when the plugin is allowed to run the show.
class to provide facilities for giving warnings up to some maximum number of times and to provide glo...
int parent2
index in _history where first parent of this jet was created (InexistentParent if this jet is an orig...
std::vector< PseudoJet > operator()(const std::vector< L > &particles) const
cluster the supplied particles and returns a vector of resulting jets, sorted by pt (or energy in the...
double dij
index in the _jets vector where we will find the
void plugin_record_iB_recombination(int jet_i, double diB)
record the fact that there has been a recombination between jets()[jet_i] and the beam...
std::vector< PseudoJet > exclusive_jets_ycut(double ycut) const
the exclusive jets obtained at the given ycut
double exclusive_ymerge_max(int njets) const
same as exclusive_dmerge_max, but normalised to squared total energy
vector< PseudoJet > sorted_by_E(const vector< PseudoJet > &jets)
return a vector of jets sorted into decreasing energy
Strategy strategy_used() const
return the enum value of the strategy used to cluster the event
int child
index in _history where second parent of this jet was created (InexistentParent if this jet is an ori...
const SharedPtr< PseudoJetStructureBase > & structure_shared_ptr() const
retrieve a shared pointer to the wrapper to this ClusterSequence
an implementation of C++0x shared pointers (or boost's)
std::string strategy_string() const
return the name of the strategy used to cluster the event
a single element in the clustering history
int n_exclusive_jets_ycut(double ycut) const
the number of exclusive jets at the given ycut
bool will_delete_self_when_unused() const
return true if the object has been told to delete itself when unused
static std::ostream * fastjet_banner_stream()
returns a pointer to the stream to be used to print banners (cout by default).
void _decant_options_partial()
assuming that the jet definition, writeout_combinations and _structure_shared_ptr have been set (e...
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...
Strategy
the various options for the algorithmic strategy to adopt in clustering events with kt and cambridge ...
bool _deletes_self_when_unused
if true then the CS will delete itself when the last external object referring to it disappears...
Class to contain pseudojets, including minimal information of use to jet-clustering routines...
double max_dij_so_far
the distance corresponding to the recombination at this stage of the clustering.
const std::vector< PseudoJet > & jets() const
allow the user to access the internally stored _jets() array, which contains both the initial particl...
double jet_scale_for_algorithm(const PseudoJet &jet) const
returns the scale associated with a jet as required for this clustering algorithm (kt^2 for the kt-al...
class that is intended to hold a full definition of the jet clusterer
unsigned int n_particles() const
returns the number of particles that were provided to the clustering algorithm (helps the user find t...