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