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;
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;
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__