52 #include "fastjet/ClusterSequence.hh" 53 #include "fastjet/CMSIterativeConePlugin.hh" 61 FASTJET_BEGIN_NAMESPACE
70 T deltaPhi (T phi1, T phi2) {
71 T result = phi1 - phi2;
72 while (result > M_PI) result -= 2*M_PI;
73 while (result <= -M_PI) result += 2*M_PI;
78 T deltaR2 (T eta1, T phi1, T eta2, T phi2) {
80 T dphi = deltaPhi (phi1, phi2);
81 return deta*deta + dphi*dphi;
85 bool CMSIterativeConePlugin::_first_time =
true;
87 string CMSIterativeConePlugin::description ()
const {
89 desc <<
"CMSIterativeCone plugin with R = " << theConeRadius <<
" and seed threshold = " << theSeedThreshold;
99 list<PseudoJet> input;
100 for (
unsigned int i=0 ; i<clust_seq.
jets().size() ; i++) {
101 input.push_back(clust_seq.
jets()[i]);
103 NumericSafeGreaterByEt<PseudoJet> compCandidate;
105 input.sort(compCandidate);
109 while( !input.empty() && (input.front().Et() > theSeedThreshold )) {
111 double eta0=input.front().eta();
112 double phi0=input.front().phi();
118 list< list<PseudoJet>::iterator> cone;
119 for(
int iteration=0;iteration<100;iteration++){
125 for(list<PseudoJet>::iterator inp=input.begin();
126 inp!=input.end();inp++){
128 if( deltaR2(eta0,phi0,tower.eta(),tower.
phi()) <
129 theConeRadius*theConeRadius) {
130 double tower_et = tower.
Et();
132 eta+= tower_et*tower.eta();
133 double dphi=tower.
phi()-phi0;
134 if(dphi>M_PI) dphi-=2*M_PI;
135 else if(dphi<=-M_PI) dphi+=2*M_PI;
142 if(phi>M_PI)phi-=2*M_PI;
143 else if(phi<=-M_PI)phi+=2*M_PI;
145 if(fabs(eta-eta0)<.001 && fabs(phi-phi0)<.001)
break;
171 list< list<PseudoJet>::iterator>::const_iterator inp;
173 int jet_k = (*inp)->cluster_hist_index();
182 while (inp != cone.end()){
186 int jet_j = (*inp)->cluster_hist_index();
208 double d_iB = clust_seq.
jets()[jet_k].perp2();
217 void CMSIterativeConePlugin::_print_banner(ostream *ostr)
const{
218 if (! _first_time)
return;
224 (*ostr) <<
"#-------------------------------------------------------------------------" << endl;
225 (*ostr) <<
"# You are running the CMS Iterative Cone plugin for FastJet " << endl;
226 (*ostr) <<
"# Original code by the CMS collaboration adapted by the FastJet authors " << endl;
227 (*ostr) <<
"# If you use this plugin, please cite " << endl;
228 (*ostr) <<
"# G. L. Bayatian et al. [CMS Collaboration], " << endl;
229 (*ostr) <<
"# CMS physics: Technical design report. " << endl;
230 (*ostr) <<
"# in addition to the usual FastJet reference. " << endl;
231 (*ostr) <<
"#-------------------------------------------------------------------------" << endl;
237 FASTJET_END_NAMESPACE
double Et() const
return the transverse energy
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
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...
double phi() const
returns phi (in the range 0..2pi)
static std::ostream * fastjet_banner_stream()
returns a pointer to the stream to be used to print banners (cout by default).
Class to contain pseudojets, including minimal information of use to jet-clustering routines...
const std::vector< PseudoJet > & jets() const
allow the user to access the internally stored _jets() array, which contains both the initial particl...