154 typedef map<const TrackingRecHit *, vector<unsigned int>,
HitComparator> RecHitMap;
156 vector<bool>
keep(tracks.size(),
true);
160 LogTrace(
"MinBiasTracking") <<
" [TrackCleaner] initial tracks : " << tracks.size();
162 for (
unsigned int i = 0;
i < tracks.size();
i++)
176 for (
unsigned int i = 0;
i < tracks.size();
i++)
178 for (vector<const TrackingRecHit *>::const_iterator
recHit = tracks[i].
second.begin();
179 recHit != tracks[
i].second.end();
181 recHitMap[*
recHit].push_back(i);
185 typedef map<unsigned int, int, less<unsigned int> > TrackMap;
187 for (
unsigned int i = 0; i < tracks.size(); i++) {
201 for (vector<const TrackingRecHit *>::const_iterator
recHit = tracks[i].
second.begin();
202 recHit != tracks[
i].second.end();
205 vector<unsigned int> sharing = recHitMap[*
recHit];
207 for (vector<unsigned int>::iterator
j = sharing.begin();
j != sharing.end();
j++)
213 for (TrackMap::iterator sharing = trackMap.begin(); sharing != trackMap.end(); sharing++) {
214 unsigned int j = (*sharing).first;
218 if (tracks[i].
second.size() >= 3) {
219 if ((*sharing).second >
min(
int(tracks[i].
second.size()),
220 int(tracks[j].
second.size())) /
224 for (vector<const TrackingRecHit *>::const_iterator
recHit = tracks[j].second.begin();
225 recHit != tracks[
j].second.end();
228 for (vector<const TrackingRecHit *>::const_iterator recHitA = tracks[i].second.begin();
229 recHitA != tracks[
i].second.end();
235 tracks[
i].second.push_back(*
recHit);
236 recHitMap[*
recHit].push_back(i);
244 LogTrace(
"TrackCleaner") <<
" Merge #" << i <<
" #" << j <<
", first now has " 245 << tracks[
i].second.size();
252 if (fabs(tracks[i].
first->d0()) < fabs(tracks[j].
first->d0()))
257 LogTrace(
"TrackCleaner") <<
" Clash #" << i <<
" #" << j <<
" keep lower d0 " << tracks[
i].first->d0()
258 <<
" " << tracks[
j].first->d0() <<
", keep #" 264 if ((*sharing).second > 1) {
265 if (tracks[i].second.size() != tracks[
j].second.size()) {
266 if (tracks[i].second.size() > tracks[
j].second.size())
272 LogTrace(
"TrackCleaner") <<
" Sharing " << (*sharing).second <<
" remove by size";
274 if (fabs(tracks[i].
first->d0()) < fabs(tracks[j].
first->d0()))
280 LogTrace(
"TrackCleaner") <<
" Sharing " << (*sharing).second <<
" remove by d0";
285 if ((*sharing).second > 0) {
298 }
while (changes > 0);
303 for (
unsigned int i = 0; i < tracks.size(); i++)
305 cleaned.push_back(tracks[i]);
307 delete tracks_[
i].first;
309 LogTrace(
"MinBiasTracking") <<
" [TrackCleaner] cleaned tracks : " << cleaned.size();
311 for (
unsigned int i = 0; i < cleaned.size(); i++)
bool canBeMerged(const std::vector< const TrackingRecHit * > &recHitsA, const std::vector< const TrackingRecHit * > &recHitsB) const
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)