163 typedef map<const TrackingRecHit*,vector<unsigned int>,
HitComparator>
166 vector<bool>
keep(tracks.size(),
true);
171 <<
" [TrackCleaner] initial tracks : " << tracks.size();
173 for(
unsigned int i = 0;
i < tracks.size();
i++)
189 for(
unsigned int i = 0;
i < tracks.size();
i++)
192 for(vector<const TrackingRecHit *>::const_iterator
193 recHit = tracks[i].
second.begin();
194 recHit!= tracks[
i].second.end(); recHit++)
195 recHitMap[*recHit].push_back(i);
199 typedef map<unsigned int,int,less<unsigned int> > TrackMap;
201 for(
unsigned int i = 0; i < tracks.size(); i++)
204 if(!
keep[i])
continue;
215 for(vector<const TrackingRecHit *>::const_iterator
216 recHit = tracks[i].
second.begin();
217 recHit!= tracks[
i].second.end(); recHit++)
220 vector<unsigned int> sharing = recHitMap[*recHit];
222 for(vector<unsigned int>::iterator
j = sharing.begin();
223 j!= sharing.end();
j++)
229 for(TrackMap::iterator sharing = trackMap.begin();
230 sharing!= trackMap.end(); sharing++)
232 unsigned int j = (*sharing).first;
235 if(tracks[i].
second.size() >=3)
237 if((*sharing).second >
min(
int(tracks[i].
second.size()),
238 int(tracks[j].
second.size()))/2)
243 for(vector<const TrackingRecHit *>::const_iterator
244 recHit = tracks[j].second.begin();
245 recHit!= tracks[
j].second.end(); recHit++)
248 for(vector<const TrackingRecHit *>::const_iterator
249 recHitA = tracks[i].second.begin();
250 recHitA!= tracks[
i].second.end(); recHitA++)
251 if(
areSame(*recHit,*recHitA)) ok =
false;
255 tracks[
i].second.push_back(*recHit);
256 recHitMap[*recHit].push_back(i);
258 sort(tracks[i].second.begin(),
259 tracks[
i].second.end(),
267 <<
" Merge #" << i <<
" #" << j
268 <<
", first now has " << tracks[
i].second.size();
277 if(fabs(tracks[i].
first->d0())
278 < fabs(tracks[j].
first->d0()))
284 <<
" Clash #" << i <<
" #" << j
285 <<
" keep lower d0 " << tracks[
i].first->d0()
286 <<
" " << tracks[
j].first->d0()
287 <<
", keep #" << (
keep[
i] ? i : (
keep[
j] ? j : 9999 ) );
294 if((*sharing).second > 1)
296 if(tracks[i].second.size() != tracks[
j].second.size())
298 if(tracks[i].second.size() > tracks[
j].second.size())
303 <<
" Sharing " << (*sharing).second <<
" remove by size";
307 if(fabs(tracks[i].
first->d0())
308 < fabs(tracks[j].
first->d0()))
313 <<
" Sharing " << (*sharing).second <<
" remove by d0";
320 if((*sharing).second > 0)
340 for(
unsigned int i = 0; i < tracks.size(); i++)
342 cleaned.push_back(tracks[i]);
346 <<
" [TrackCleaner] cleaned tracks : " << cleaned.size();
348 for(
unsigned int i = 0; i < cleaned.size(); i++)
bool canBeMerged(const std::vector< const TrackingRecHit * > &recHitsA, const std::vector< const TrackingRecHit * > &recHitsB) const
const std::vector< reco::PFCandidatePtr > & tracks_
U second(std::pair< T, U > const &p)
const TrackerTopology * tTopo_
std::vector< TrackWithRecHits > TracksWithRecHits
bool areSame(const TrackingRecHit *a, const TrackingRecHit *b) const
static std::string getInfo(const DetId &id, const TrackerTopology *tTopo)