59 {
60 B2DEBUG(29, "CDCCKFDuplicateRemover: " << results.size() << " paths created (might be without any hits)");
61
62 std::vector<CDCCKFResult> goodResults;
63
64
65 TrackFindingCDC::Weight weight;
66 std::unordered_map<double, CDCCKFResult> resultToWeightList;
67 for (const auto& result : results) {
68 weight = m_filter_badTracks(result);
69 if (not std::isnan(weight)) {
70 goodResults.push_back(result);
71 }
72 }
73
74 int n_goodresults = goodResults.size();
75
76 B2DEBUG(29, "CDCCKFDuplicateRemover: " << goodResults.size() << " paths created (after filtering)");
77
78 if (n_goodresults > 1) {
79 for (const auto& result : goodResults) {
80 B2DEBUG(29, "charge = " << result.front().getSeed()->getChargeSeed() << "; "
81 << "theta = " << result.front().getSeed()->getPositionSeed().Theta() * 180. / M_PI << "; "
82 << (result.size() - 1) << " hits (" << result.at(1).getWireHit()->getWire().getICLayer() << "->" <<
83 result.back().getWireHit()->getWire().getICLayer() << "); "
84 << "r/z = " << result.front().getSeed()->getPositionSeed().Rho() << "; " << result.front().getSeed()->getPositionSeed().Z());
85 }
86 }
87
88
89 auto iter = goodResults.begin();
90 while (iter < goodResults.end()) {
91 auto iter2 = iter + 1;
92 bool increaseIter = true;
93 while (iter2 < goodResults.end()) {
94
95 if (iter2->front().getSeed()->getRelated<ECLShower>() == iter2->front().getSeed()->getRelated<ECLShower>()) {
96
97 bool selectFirst = m_filter_duplicateTrack(std::pair(&*iter, &*iter2)) > 0;
98 if (selectFirst) {
99 iter2 = goodResults.erase(iter2);
100 } else {
101 iter = goodResults.erase(iter);
102 increaseIter = false;
103 break;
104 }
105 } else {
106 ++iter2;
107 }
108 }
109 if (increaseIter) {
110 ++iter;
111 }
112 }
113
114 B2DEBUG(29, "CDCCKFDuplicateRemover: " << goodResults.size() << " paths created (after duplicates)");
115
116 if (n_goodresults > 1) {
117 for (const auto& result : goodResults) {
118 B2DEBUG(29, "charge = " << result.front().getSeed()->getChargeSeed() << "; "
119 << "theta = " << result.front().getSeed()->getPositionSeed().Theta() * 180. / M_PI << "; "
120 << (result.size() - 1) << " hits (" << result.at(1).getWireHit()->getWire().getICLayer() << "->" <<
121 result.back().getWireHit()->getWire().getICLayer() << "); "
122 << "r/z = " << result.front().getSeed()->getPositionSeed().Rho() << "; " << result.front().getSeed()->getPositionSeed().Z());
123 }
124 }
125
126
127
128 iter = goodResults.begin();
129 while (iter < goodResults.end()) {
130 double phiClus = iter->front().getSeed()->getPositionSeed().Phi();
131 double thetaClus = iter->front().getSeed()->getPositionSeed().Theta();
132
133 auto iter2 = iter + 1;
134 bool increaseIter = true;
135 while (iter2 < goodResults.end()) {
136
137
138 if (std::abs(ROOT::Math::VectorUtil::Phi_mpi_pi(iter2->front().getSeed()->getPositionSeed().Phi() - phiClus)) < duplicateSeed_maxPhi
139 && std::abs(iter2->front().getSeed()->getPositionSeed().Theta() - thetaClus) < duplicateSeed_maxTheta) {
140
141 bool isDuplicate = m_filter_duplicateSeed(std::pair(&*iter, &*iter2)) > 0;
142 if (! isDuplicate) {
143 B2DEBUG(29, "Keeping both tracks");
144 ++iter2;
145 } else {
146 B2DEBUG(29, "Duplicate hits found");
147 bool selectFirst = m_filter_duplicateTrack(std::pair(&*iter, &*iter2)) > 0;
148 if (selectFirst) {
149 iter2 = goodResults.erase(iter2);
150 } else {
151 iter = goodResults.erase(iter);
152 increaseIter = false;
153 break;
154 }
155 }
156 } else {
157 ++iter2;
158 }
159 }
160 if (increaseIter) {
161 ++iter;
162 }
163 }
164
165 results = goodResults;
166
167 B2DEBUG(29, "CDCCKFDuplicateRemover: " << results.size() << " paths created (after merging)");
168
169 if (n_goodresults > 1) {
170 for (const auto& result : results) {
171 B2DEBUG(29, "charge = " << result.front().getSeed()->getChargeSeed() << "; "
172 << "theta = " << result.front().getSeed()->getPositionSeed().Theta() * 180. / M_PI << "; "
173 << (result.size() - 1) << " hits (" << result.at(1).getWireHit()->getWire().getICLayer() << "->" <<
174 result.back().getWireHit()->getWire().getICLayer() << "); "
175 << "r/z = " << result.front().getSeed()->getPositionSeed().Rho() << "; " << result.front().getSeed()->getPositionSeed().Z());
176 }
177 }
178 }