1#ifndef D0RunIIconeJets_CONESPLITMERGE
2#define D0RunIIconeJets_CONESPLITMERGE
61#include "ProtoJet.hpp"
65#include <fastjet/internal/base.hh>
67FASTJET_BEGIN_NAMESPACE
74class ProtoJet_ET_seedET_order
77 bool operator()(
const ProtoJet<Item> & first,
const ProtoJet<Item> & second)
const
79 if ( first.pT() > second.pT() )
return true;
81 if ( first.pT() < second.pT() )
return false;
82 else return ( first.info().seedET() > second.info().seedET() );
92 typedef std::multimap<ProtoJet<Item>,float,ProtoJet_ET_seedET_order<Item> > PJMMAP;
95 ConeSplitMerge(
const std::vector<ProtoJet<Item> >& jvector);
96 ConeSplitMerge(
const std::list<ProtoJet<Item> >& jlist);
98 void split_merge(std::vector<ProtoJet<Item> >& ecv,
float s,
float pT_min_leading_protojet,
float pT_min_second_protojet,
int MergeMax,
float pT_min_noMergeMax);
105ConeSplitMerge<Item>::ConeSplitMerge():_members() {;}
108ConeSplitMerge<Item>::ConeSplitMerge(
const std::vector<ProtoJet<Item> >& jvector)
111 typename std::vector<ProtoJet<Item> >::const_iterator jt;
112 for(jt = jvector.begin(); jt != jvector.end(); ++jt)
115 ProtoJet<Item> jet(*jt);
117 _members.insert(std::make_pair(jet,jet.pT()));
122ConeSplitMerge<Item>::ConeSplitMerge(
const std::list<ProtoJet<Item> >& jlist)
126 typename std::list<ProtoJet<Item> >::const_iterator jt;
127 for(jt = jlist.begin(); jt != jlist.end(); ++jt)
130 ProtoJet<Item> jet(*jt);
132 _members.insert(std::make_pair(jet,jet.pT()));
137void ConeSplitMerge<Item>::split_merge(std::vector<ProtoJet<Item> >& jcv,
138 float shared_ET_fraction,
139 float pT_min_leading_protojet,
float pT_min_second_protojet,
140 int MergeMax,
float pT_min_noMergeMax)
142 while(!_members.empty())
159 typename PJMMAP::iterator itmax= _members.begin();
160 ProtoJet<Item> imax((*itmax).first);
161 const std::list<const Item*>& ilist(imax.LItems());
163 _members.erase(itmax);
167 float shared_ET = 0.;
168 typename PJMMAP::iterator jtmax;
169 typename PJMMAP::iterator jt;
170 for(jt = _members.begin(); jt != _members.end(); ++jt)
172 const std::list<const Item*>& jlist((*jt).first.LItems());
173 typename std::list<const Item*>::const_iterator tk;
175 for(tk = ilist.begin(), count = 0; tk != ilist.end();
178 typename std::list<const Item*>::const_iterator where=
179 find(jlist.begin(),jlist.end(),*tk);
180 if(where != jlist.end())
183 shared_ET += (*tk)->pT();
201 ProtoJet<Item> jmax((*jtmax).first);
204 _members.erase(jtmax);
210 if( shared_ET > (jmax.pT())*shared_ET_fraction
211 && (imax.pT() > pT_min_leading_protojet || jmax.pT() > pT_min_second_protojet)
212 && (imax.info().nbMerge() < MergeMax || imax.pT() > pT_min_noMergeMax))
215 const std::list<const Item*>& jlist(jmax.LItems());
216 typename std::list<const Item*>::const_iterator tk;
217 typename std::list<const Item*>::const_iterator iend= ilist.end();
219 for(tk = jlist.begin(); tk != jlist.end(); ++tk)
221 typename std::list<const Item*>::const_iterator where=
222 find(ilist.begin(),iend,*tk);
241 else if(shared_ET > (jmax.pT())*shared_ET_fraction)
244 std::list<const Item*> ilist(imax.LItems());
245 std::list<const Item*> jlist(jmax.LItems());
247 typename std::list<const Item*>::iterator tk;
248 for(tk = jlist.begin(); tk != jlist.end(); )
250 typename std::list<const Item*>::iterator where=
251 find(ilist.begin(),ilist.end(),*tk);
252 if(where != ilist.end()) {
253 tk = jlist.erase(tk);
260 for (
typename std::list<const Item*>::const_iterator it = jlist.begin();
261 it != jlist.end(); ++it) jmax.addItem(*it);
267 _members.insert(std::make_pair(jmax,jmax.pT()));
274 std::list<const Item*> ilist(imax.LItems());
275 std::list<const Item*> jlist(jmax.LItems());
277 typename std::list<const Item*>::iterator tk;
278 for(tk = jlist.begin(); tk != jlist.end(); )
280 typename std::list<const Item*>::iterator where=
281 find(ilist.begin(),ilist.end(),*tk);
282 if(where != ilist.end()) {
283 float yk = (*tk)->y();
284 float phik = (*tk)->phi();
285 float di= RD2(imax.y(),imax.phi(),yk,phik);
286 float dj= RD2(jmax.y(),jmax.phi(),yk,phik);
289 tk = jlist.erase(tk);
306 for (
typename std::list<const Item*>::const_iterator it = ilist.begin();
307 it != ilist.end(); ++it) imax.addItem(*it);
317 for (
typename std::list<const Item*>::const_iterator it = jlist.begin();
318 it != jlist.end(); ++it) jmax.addItem(*it);
324 _members.insert(std::make_pair(jmax,jmax.pT()));
326 _members.insert(std::make_pair(imax,imax.pT()));