3 #include "fastjet/ClusterSequence.hh" 4 #include "fastjet/SISConePlugin.hh" 7 #include "siscone/momentum.h" 8 #include "siscone/siscone.h" 13 FASTJET_BEGIN_NAMESPACE
19 template<> PseudoJet::PseudoJet(
const siscone::Cmomentum & four_vector) {
20 (*this) =
PseudoJet(four_vector.px,four_vector.py,four_vector.pz,
26 namespace siscone_plugin_internal{
33 class SISConeUserScale :
public siscone::Csplit_merge::Cuser_scale_base{
40 : _user_scale(user_scale), _cs(cs){}
43 virtual double operator()(
const siscone::Cjet &jet)
const{
44 return _user_scale->result(_build_PJ_from_Cjet(jet));
49 virtual bool is_larger(
const siscone::Cjet &a,
const siscone::Cjet &b)
const{
50 return _user_scale->is_larger(_build_PJ_from_Cjet(a), _build_PJ_from_Cjet(b));
61 PseudoJet _build_PJ_from_Cjet(
const siscone::Cjet &jet)
const{
62 PseudoJet j(jet.v.px, jet.v.py, jet.v.pz, jet.v.E);
88 string SISConePlugin::description ()
const {
91 const string on =
"on";
92 const string off =
"off";
94 string sm_scale_string =
"split-merge uses " +
95 split_merge_scale_name(Esplit_merge_scale(split_merge_scale()));
97 desc <<
"SISCone jet algorithm with " ;
98 desc <<
"cone_radius = " << cone_radius () <<
", ";
99 if (_progressive_removal)
100 desc <<
"progressive-removal mode, ";
102 desc <<
"overlap_threshold = " << overlap_threshold () <<
", ";
103 desc <<
"n_pass_max = " << n_pass_max () <<
", ";
104 desc <<
"protojet_ptmin = " << protojet_ptmin() <<
", ";
105 if (_progressive_removal && _user_scale) {
106 desc <<
"using a user-defined scale for ordering of stable cones";
107 string user_scale_desc = _user_scale->description();
108 if (user_scale_desc !=
"") desc <<
" (" << user_scale_desc <<
")";
110 desc << sm_scale_string;
112 if (!_progressive_removal){
113 desc <<
", caching turned " << (caching() ? on : off);
114 desc <<
", SM stop scale = " << _split_merge_stopping_scale;
118 if (_use_pt_weighted_splitting){
119 desc <<
", using pt-weighted splitting";
122 if (_use_jet_def_recombiner){
123 desc <<
", using jet-definition's own recombiner";
128 if (siscone.merge_identical_protocones) {
129 desc <<
", and (IR unsafe) merge_indentical_protocones=true" ;
132 desc <<
", SISCone code v" << siscone_version();
143 Csiscone local_siscone;
146 unsigned n = clust_seq.
jets().size();
148 bool new_siscone =
true;
150 if (caching() && !_progressive_removal) {
156 if (stored_siscone.get() != 0) {
157 new_siscone = !(stored_plugin->cone_radius() == cone_radius()
158 && stored_plugin->n_pass_max() == n_pass_max()
159 && stored_particles->size() == n);
161 for(
unsigned i = 0; i < n; i++) {
165 (*stored_particles)[i]);
172 stored_siscone .reset(
new Csiscone );
173 stored_particles.reset(
new std::vector<PseudoJet>(clust_seq.
jets()));
174 reset_stored_plugin();
177 siscone = stored_siscone.get();
179 siscone = &local_siscone;
183 siscone->SM_var2_hardest_cut_off = _split_merge_stopping_scale*_split_merge_stopping_scale;
188 siscone->stable_cone_soft_pt2_cutoff = ghost_separation_scale()
189 * ghost_separation_scale();
191 siscone->set_pt_weighted_splitting(_use_pt_weighted_splitting);
195 std::vector<Cmomentum> siscone_momenta(n);
196 for(
unsigned i = 0; i < n; i++) {
198 siscone_momenta[i] = Cmomentum(p.px(), p.py(), p.pz(), p.E());
203 if (_progressive_removal){
207 internal_scale.
reset(
new siscone_plugin_internal::SISConeUserScale(_user_scale, clust_seq));
208 siscone->set_user_scale(internal_scale.
get());
210 siscone->compute_jets_progressive_removal(siscone_momenta, cone_radius(),
211 n_pass_max(), protojet_or_ghost_ptmin(),
212 Esplit_merge_scale(split_merge_scale()));
214 siscone->compute_jets(siscone_momenta, cone_radius(), overlap_threshold(),
215 n_pass_max(), protojet_or_ghost_ptmin(),
216 Esplit_merge_scale(split_merge_scale()));
222 siscone->recompute_jets(overlap_threshold(), protojet_or_ghost_ptmin(),
223 Esplit_merge_scale(split_merge_scale()));
227 int njet = siscone->jets.size();
236 for (
int ijet = njet-1; ijet >= 0; ijet--) {
237 const Cjet & jet = siscone->jets[ijet];
242 int jet_k = jet.contents[0];
243 for (
unsigned ipart = 1; ipart < jet.contents.size(); ipart++) {
247 int jet_j = jet.contents[ipart];
251 if (_use_jet_def_recombiner) {
267 double d_iB = clust_seq.
jets()[jet_k].perp2();
271 extras->_pass[clust_seq.
jets()[jet_k].cluster_hist_index()] = jet.pass;
275 for (
unsigned ipass = 0; ipass < siscone->protocones_list.size(); ipass++) {
276 for (
unsigned ipc = 0; ipc < siscone->protocones_list[ipass].size(); ipc++) {
277 PseudoJet protocone(siscone->protocones_list[ipass][ipc]);
279 extras->_protocones.push_back(protocone);
282 extras->_most_ambiguous_split = siscone->most_ambiguous_split;
285 extras->_jet_def_plugin =
this;
297 void SISConePlugin::reset_stored_plugin()
const{
351 FASTJET_END_NAMESPACE
void plugin_associate_extras(Extras *extras_in)
the plugin can associate some extra information with the ClusterSequence object by calling this funct...
void set_user_index(const int index)
set the user_index, intended to allow the user to add simple identifying information to a particle/je...
T * get() const
get the stored pointer
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
template class derived from UserScaleBase::StryctureType that works for both SISCone jet classes impl...
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...
an implementation of C++0x shared pointers (or boost's)
bool have_same_momentum(const PseudoJet &jeta, const PseudoJet &jetb)
returns true if the momenta of the two input jets are identical
base class for user-defined ordering of stable cones (used for prorgessive removal) ...
void set_structure_shared_ptr(const SharedPtr< PseudoJetStructureBase > &structure)
set the associated structure
static std::ostream * fastjet_banner_stream()
returns a pointer to the stream to be used to print banners (cout by default).
Implementation of the SISCone algorithm (plugin for fastjet v2.1 upwards)
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...
void reset()
reset the pointer to default value (NULL)