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 #include "fastjet/PxConePlugin.hh"
00032
00033 #include "fastjet/ClusterSequence.hh"
00034 #include <sstream>
00035
00036
00037 #include "pxcone.h"
00038
00039
00040 FASTJET_BEGIN_NAMESPACE
00041
00042 using namespace std;
00043
00044 string PxConePlugin::description () const {
00045 ostringstream desc;
00046
00047 desc << "PxCone jet algorithm with "
00048 << "cone_radius = " << cone_radius () << ", "
00049 << "min_jet_energy = " << min_jet_energy () << ", "
00050 << "overlap_threshold = " << overlap_threshold () << ", "
00051 << "E_scheme_jets = " << E_scheme_jets ()
00052 << " (NB: non-standard version of PxCone, containing small bug fixes by Gavin Salam)";
00053
00054 return desc.str();
00055 }
00056
00057
00058 void PxConePlugin::run_clustering(ClusterSequence & clust_seq) const {
00059
00060
00061 int mode = 2;
00062
00063 int ntrak = clust_seq.jets().size(), itkdm = 4;
00064 double ptrak[ntrak][4];
00065 for (int i = 0; i < ntrak; i++) {
00066 ptrak[i][0] = clust_seq.jets()[i].px();
00067 ptrak[i][1] = clust_seq.jets()[i].py();
00068 ptrak[i][2] = clust_seq.jets()[i].pz();
00069 ptrak[i][3] = clust_seq.jets()[i].E();
00070 }
00071
00072
00073 int mxjet = ntrak;
00074 int njet;
00075 double pjet[mxjet][5];
00076 int ipass[ntrak], ijmul[mxjet], ierr;
00077
00078
00079 pxcone(
00080 mode ,
00081 ntrak ,
00082 itkdm ,
00083 &(ptrak[0][0]) ,
00084 cone_radius() ,
00085 min_jet_energy() ,
00086 overlap_threshold() ,
00087 mxjet ,
00088 njet ,
00089 &(pjet[0][0]),
00090 ipass,
00091
00092 ijmul,
00093 ierr
00094 );
00095
00096 if (ierr != 0) throw Error("An error occurred while running PXCONE");
00097
00098
00099 valarray<int> last_index_created(njet);
00100
00101 vector<vector<int> > jet_particle_content(njet);
00102
00103
00104 for (int itrak = 0; itrak < ntrak; itrak++) {
00105 int jet_i = ipass[itrak] - 1;
00106 if (jet_i >= 0) jet_particle_content[jet_i].push_back(itrak);
00107 }
00108
00109
00110
00111
00112 for(int ipxjet = njet-1; ipxjet >= 0; ipxjet--) {
00113 const vector<int> & jet_trak_list = jet_particle_content[ipxjet];
00114 int jet_k = jet_trak_list[0];
00115
00116 for (unsigned ilist = 1; ilist < jet_trak_list.size(); ilist++) {
00117 int jet_i = jet_k;
00118
00119 int jet_j = jet_trak_list[ilist];
00120
00121 double dij = 0.0;
00122
00123 if (ilist != jet_trak_list.size()-1 || E_scheme_jets()) {
00124
00125 clust_seq.plugin_record_ij_recombination(jet_i, jet_j, dij, jet_k);
00126 } else {
00127
00128
00129 clust_seq.plugin_record_ij_recombination(jet_i, jet_j, dij,
00130 PseudoJet(pjet[ipxjet][0],pjet[ipxjet][1],
00131 pjet[ipxjet][2],pjet[ipxjet][3]),
00132 jet_k);
00133 }
00134 }
00135
00136
00137 double d_iB = clust_seq.jets()[jet_k].perp2();
00138 clust_seq.plugin_record_iB_recombination(jet_k, d_iB);
00139 }
00140
00141
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00155 }
00156
00157 FASTJET_END_NAMESPACE