14 using namespace pixeltrackfitting;
35 int r1 = (tTopo_->pxbLayer(i1) - 1) * 2 + (tTopo_->pxbLadder(i1) - 1) % 2;
36 int r2 = (tTopo_->pxbLayer(i2) - 1) * 2 + (tTopo_->pxbLadder(i2) - 1) % 2;
40 int r1 = (tTopo_->pxfDisk(i1) - 1) * 2 + (tTopo_->pxfPanel(i1) - 1) % 2;
41 int r2 = (tTopo_->pxfDisk(i2) - 1) * 2 + (tTopo_->pxfPanel(i2) - 1) % 2;
104 constexpr
int max[4] = {20, 32, 44, 64};
107 if (dphi > max[aLayer] / 2)
108 dphi = max[aLayer] - dphi;
112 if (dphi == 1 && dz <= 1)
120 constexpr
int max = 24;
127 if (dphi <= 1 && dr <= 1 && !(dphi == 0 && dr == 0))
136 const vector<const TrackingRecHit *> &recHitsB)
const {
139 for (vector<const TrackingRecHit *>::const_iterator recHitA = recHitsA.begin(); recHitA != recHitsA.end(); recHitA++)
140 for (vector<const TrackingRecHit *>::const_iterator recHitB = recHitsB.begin(); recHitB != recHitsB.end();
142 if (!
areSame(*recHitA, *recHitB))
143 if (!
isCompatible((*recHitA)->geographicalId(), (*recHitB)->geographicalId()))
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())) /
222 if (
canBeMerged(tracks[i].second, tracks[j].second)) {
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();
231 if (
areSame(*recHit, *recHitA))
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
unsigned int pxfDisk(const DetId &id) const
unsigned int pxbLadder(const DetId &id) const
unsigned int pxbModule(const DetId &id) const
auto const & tracks
cannot be loose
TracksWithRecHits cleanTracks(const TracksWithRecHits &tracksWithRecHits) const override
U second(std::pair< T, U > const &p)
HitComparatorByRadius(const TrackerTopology *tTopo)
bool operator()(const TrackingRecHit *a, const TrackingRecHit *b) const
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
Abs< T >::type abs(const T &t)
unsigned int pxfModule(const DetId &id) const
unsigned int pxbLayer(const DetId &id) const
const TrackerTopology * tTopo_
TrackCleaner(const TrackerTopology *tTopo)
bool isCompatible(const DetId &i1, const DetId &i2) const
unsigned int pxfSide(const DetId &id) const
bool operator()(const TrackingRecHit *a, const TrackingRecHit *b) const
DetId geographicalId() const
bool areSame(const TrackingRecHit *a, const TrackingRecHit *b) const
static std::string getInfo(const DetId &id, const TrackerTopology *tTopo)
virtual LocalPoint localPosition() const =0
unsigned int pxfPanel(const DetId &id) const
unsigned int pxfBlade(const DetId &id) const
pixeltrackfitting::TracksWithRecHits TracksWithRecHits
const TrackerTopology * tTopo_