TrackJetPlugin.cc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "fastjet/ClusterSequence.hh"
00033 #include "fastjet/TrackJetPlugin.hh"
00034
00035
00036 #include <vector>
00037 #include <sstream>
00038
00039 FASTJET_BEGIN_NAMESPACE
00040
00041 using namespace std;
00042
00043 class TrackJetParticlePtr{
00044 public:
00045 TrackJetParticlePtr(int i_index, double i_perp2)
00046 : index(i_index), perp2(i_perp2){}
00047
00048 int index;
00049 double perp2;
00050
00051 bool operator <(const TrackJetParticlePtr &other) const {
00052 return perp2>other.perp2;
00053 }
00054 };
00055
00056 string TrackJetPlugin::description () const {
00057 ostringstream desc;
00058 desc << "TrackJet algorithm with R = " << R();
00059 return desc.str();
00060 }
00061
00062 void TrackJetPlugin::run_clustering(ClusterSequence & clust_seq) const {
00063
00064 vector<TrackJetParticlePtr> particle_list;
00065
00066 const vector<PseudoJet> & jets = clust_seq.jets();
00067 int index=0;
00068 for (vector<PseudoJet>::const_iterator mom_it = jets.begin(); mom_it != jets.end(); mom_it++){
00069 particle_list.push_back(TrackJetParticlePtr(index, mom_it->perp2()));
00070 index++;
00071 }
00072
00073
00074 sort(particle_list.begin(), particle_list.end());
00075
00076
00077
00078
00079
00080 vector<PseudoJet> tuned_particles = clust_seq.jets();
00081 vector<PseudoJet> tuned_tracks = clust_seq.jets();
00082 for (vector<PseudoJet>::iterator pit = tuned_particles.begin();
00083 pit != tuned_particles.end(); pit++)
00084 _jet_recombiner.preprocess(*pit);
00085 for (vector<PseudoJet>::iterator pit = tuned_tracks.begin();
00086 pit != tuned_tracks.end(); pit++)
00087 _track_recombiner.preprocess(*pit);
00088
00089
00090
00091 list<int> sorted_pt_index;
00092 for (vector<TrackJetParticlePtr>::iterator mom_it = particle_list.begin();
00093 mom_it != particle_list.end(); mom_it++)
00094 sorted_pt_index.push_back(mom_it->index);
00095
00096
00097 while (sorted_pt_index.size()){
00098
00099
00100
00101 int current_jet_index = sorted_pt_index.front();
00102 PseudoJet current_jet = tuned_particles[current_jet_index];
00103 PseudoJet current_track = tuned_tracks[current_jet_index];
00104
00105
00106 list<int>::iterator index_it = sorted_pt_index.begin();
00107 sorted_pt_index.erase(index_it);
00108
00109
00110 index_it = sorted_pt_index.begin();
00111 while (index_it != sorted_pt_index.end()){
00112 const PseudoJet & current_particle = tuned_particles[*index_it];
00113 const PseudoJet & current_particle_track = tuned_tracks[*index_it];
00114
00115
00116 double distance2 = current_track.plain_distance(current_particle_track);
00117 if (distance2 <= _radius2){
00118
00119 PseudoJet new_track;
00120 PseudoJet new_jet;
00121 _jet_recombiner.recombine(current_jet, current_particle, new_jet);
00122 _track_recombiner.recombine(current_track, current_particle_track, new_track);
00123
00124 int new_jet_index;
00125 clust_seq.plugin_record_ij_recombination(current_jet_index, *index_it, distance2, new_jet, new_jet_index);
00126
00127 current_jet = new_jet;
00128 current_track = new_track;
00129 current_jet_index = new_jet_index;
00130
00131
00132 sorted_pt_index.erase(index_it);
00133
00134
00135
00136 index_it = sorted_pt_index.begin();
00137 } else {
00138 index_it++;
00139 }
00140 }
00141
00142
00143 clust_seq.plugin_record_iB_recombination(current_jet_index, _radius2);
00144 }
00145
00146 }
00147
00148 FASTJET_END_NAMESPACE