ConeSplitMerge.hpp
Go to the documentation of this file.00001 #ifndef D0RunIIconeJets_CONESPLITMERGE
00002 #define D0RunIIconeJets_CONESPLITMERGE
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
00033
00034 #include <iostream>
00035 #include <map>
00036 #include <utility>
00037 #include <vector>
00038 #include "ProtoJet.hpp"
00039
00040
00041
00042 #include <fastjet/internal/base.hh>
00043
00044 FASTJET_BEGIN_NAMESPACE
00045
00046 namespace d0{
00047
00048
00049
00050 template <class Item>
00051 class ProtoJet_ET_seedET_order
00052 {
00053 public:
00054 bool operator()(const ProtoJet<Item> & first, const ProtoJet<Item> & second)
00055 {
00056 if ( first.pT() > second.pT() ) return true;
00057 else
00058 if ( first.pT() < second.pT() ) return false;
00059 else return ( first.info().seedET() > second.info().seedET() );
00060 }
00061 };
00062
00063
00064 template <class Item>
00065 class ConeSplitMerge {
00066
00067 public :
00068
00069 typedef std::multimap<ProtoJet<Item>,float,ProtoJet_ET_seedET_order<Item> > PJMMAP;
00070
00071 ConeSplitMerge();
00072 ConeSplitMerge(const std::vector<ProtoJet<Item> >& jvector);
00073 ConeSplitMerge(const std::list<ProtoJet<Item> >& jlist);
00074 ~ConeSplitMerge() {;}
00075 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);
00076
00077 private :
00078 PJMMAP _members;
00079 };
00081 template<class Item>
00082 ConeSplitMerge<Item>::ConeSplitMerge():_members() {;}
00083
00084 template<class Item>
00085 ConeSplitMerge<Item>::ConeSplitMerge(const std::vector<ProtoJet<Item> >& jvector)
00086 {
00087
00088 typename std::vector<ProtoJet<Item> >::const_iterator jt;
00089 for(jt = jvector.begin(); jt != jvector.end(); ++jt)
00090 {
00091
00092 ProtoJet<Item> jet(*jt);
00093 jet.NowStable();
00094 _members.insert(std::make_pair(jet,jet.pT()));
00095 }
00096 }
00097
00098 template<class Item>
00099 ConeSplitMerge<Item>::ConeSplitMerge(const std::list<ProtoJet<Item> >& jlist)
00100 {
00101
00102
00103 typename std::list<ProtoJet<Item> >::const_iterator jt;
00104 for(jt = jlist.begin(); jt != jlist.end(); ++jt)
00105 {
00106
00107 ProtoJet<Item> jet(*jt);
00108 jet.NowStable();
00109 _members.insert(std::make_pair(jet,jet.pT()));
00110 }
00111 }
00112
00113 template<class Item>
00114 void ConeSplitMerge<Item>::split_merge(std::vector<ProtoJet<Item> >& jcv,
00115 float shared_ET_fraction,
00116 float pT_min_leading_protojet, float pT_min_second_protojet,
00117 int MergeMax, float pT_min_noMergeMax)
00118 {
00119 while(!_members.empty())
00120 {
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 typename PJMMAP::iterator itmax= _members.begin();
00137 ProtoJet<Item> imax((*itmax).first);
00138 const std::list<const Item*>& ilist(imax.LItems());
00139
00140 _members.erase(itmax);
00141
00142
00143 bool share= false;
00144 float shared_ET = 0.;
00145 typename PJMMAP::iterator jtmax;
00146 typename PJMMAP::iterator jt;
00147 for(jt = _members.begin(); jt != _members.end(); ++jt)
00148 {
00149 const std::list<const Item*>& jlist((*jt).first.LItems());
00150 typename std::list<const Item*>::const_iterator tk;
00151 int count;
00152 for(tk = ilist.begin(), count = 0; tk != ilist.end();
00153 ++tk, ++count)
00154 {
00155 typename std::list<const Item*>::const_iterator where=
00156 find(jlist.begin(),jlist.end(),*tk);
00157 if(where != jlist.end())
00158 {
00159 share= true;
00160 shared_ET += (*tk)->pT();
00161 }
00162 }
00163 if(share)
00164 {
00165 jtmax = jt;
00166 break;
00167 }
00168 }
00169
00170 if(!share) {
00171
00172 jcv.push_back(imax);
00173
00174 }
00175 else
00176 {
00177
00178 ProtoJet<Item> jmax((*jtmax).first);
00179
00180
00181 _members.erase(jtmax);
00182
00183
00184
00185
00186
00187 if( shared_ET > (jmax.pT())*shared_ET_fraction
00188 && (imax.pT() > pT_min_leading_protojet || jmax.pT() > pT_min_second_protojet)
00189 && (imax.info().nbMerge() < MergeMax || imax.pT() > pT_min_noMergeMax))
00190 {
00191
00192 const std::list<const Item*>& jlist(jmax.LItems());
00193 typename std::list<const Item*>::const_iterator tk;
00194 typename std::list<const Item*>::const_iterator iend= ilist.end();
00195 bool same = true;
00196 for(tk = jlist.begin(); tk != jlist.end(); ++tk)
00197 {
00198 typename std::list<const Item*>::const_iterator where=
00199 find(ilist.begin(),iend,*tk);
00200 if(where == iend)
00201 {
00202 imax.addItem(*tk);
00203 same = false;
00204 }
00205 }
00206 if ( ! same )
00207 {
00208
00209
00210
00211 imax.updateJet();
00212 imax.merged();
00213
00214 }
00215 }
00216
00217
00218 else if(shared_ET > (jmax.pT())*shared_ET_fraction)
00219 {
00220
00221 std::list<const Item*> ilist(imax.LItems());
00222 std::list<const Item*> jlist(jmax.LItems());
00223
00224 typename std::list<const Item*>::iterator tk;
00225 for(tk = jlist.begin(); tk != jlist.end(); )
00226 {
00227 typename std::list<const Item*>::iterator where=
00228 find(ilist.begin(),ilist.end(),*tk);
00229 if(where != ilist.end()) {
00230 tk = jlist.erase(tk);
00231 }
00232 else ++tk;
00233 }
00234
00235 jmax.erase();
00236
00237 for ( typename std::list<const Item*>::const_iterator it = jlist.begin();
00238 it != jlist.end(); ++it) jmax.addItem(*it);
00239
00240
00241 jmax.updateJet();
00242 jmax.splitted();
00243
00244 _members.insert(std::make_pair(jmax,jmax.pT()));
00245 }
00246
00247
00248 else
00249 {
00250
00251 std::list<const Item*> ilist(imax.LItems());
00252 std::list<const Item*> jlist(jmax.LItems());
00253
00254 typename std::list<const Item*>::iterator tk;
00255 for(tk = jlist.begin(); tk != jlist.end(); )
00256 {
00257 typename std::list<const Item*>::iterator where=
00258 find(ilist.begin(),ilist.end(),*tk);
00259 if(where != ilist.end()) {
00260 float yk = (*tk)->y();
00261 float phik = (*tk)->phi();
00262 float di= RD2(imax.y(),imax.phi(),yk,phik);
00263 float dj= RD2(jmax.y(),jmax.phi(),yk,phik);
00264 if(dj > di)
00265 {
00266 tk = jlist.erase(tk);
00267
00268 }
00269 else
00270 {
00271 ilist.erase(where);
00272 ++tk;
00273
00274 }
00275 }
00276 else ++tk;
00277 }
00278
00279
00280
00281 imax.erase();
00282
00283 for ( typename std::list<const Item*>::const_iterator it = ilist.begin();
00284 it != ilist.end(); ++it) imax.addItem(*it);
00285
00286 imax.updateJet();
00287 imax.splitted();
00288
00289
00290
00291
00292 jmax.erase();
00293
00294 for ( typename std::list<const Item*>::const_iterator it = jlist.begin();
00295 it != jlist.end(); ++it) jmax.addItem(*it);
00296
00297 jmax.updateJet();
00298 jmax.splitted();
00299
00300
00301 _members.insert(std::make_pair(jmax,jmax.pT()));
00302 }
00303 _members.insert(std::make_pair(imax,imax.pT()));
00304 }
00305 }
00306 }
00308
00309 }
00310
00311 FASTJET_END_NAMESPACE
00312
00313 #endif