58 void apply(std::vector<CDCCKFResult>& results)
override
60 B2DEBUG(29,
"CDCCKFDuplicateRemover: " << results.size() <<
" paths created (might be without any hits)");
62 std::vector<CDCCKFResult> goodResults;
65 TrackFindingCDC::Weight weight;
66 std::unordered_map<double, CDCCKFResult> resultToWeightList;
67 for (
const auto& result : results) {
69 if (not std::isnan(weight)) {
70 goodResults.push_back(result);
74 int n_goodresults = goodResults.size();
76 B2DEBUG(29,
"CDCCKFDuplicateRemover: " << goodResults.size() <<
" paths created (after filtering)");
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());
89 auto iter = goodResults.begin();
90 while (iter < goodResults.end()) {
91 auto iter2 = iter + 1;
92 bool increaseIter =
true;
93 while (iter2 < goodResults.end()) {
99 iter2 = goodResults.erase(iter2);
101 iter = goodResults.erase(iter);
102 increaseIter =
false;
114 B2DEBUG(29,
"CDCCKFDuplicateRemover: " << goodResults.size() <<
" paths created (after duplicates)");
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());
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();
133 auto iter2 = iter + 1;
134 bool increaseIter =
true;
135 while (iter2 < goodResults.end()) {
138 if (std::abs(ROOT::Math::VectorUtil::Phi_mpi_pi(iter2->front().getSeed()->getPositionSeed().Phi() - phiClus)) <
duplicateSeed_maxPhi
143 B2DEBUG(29,
"Keeping both tracks");
146 B2DEBUG(29,
"Duplicate hits found");
149 iter2 = goodResults.erase(iter2);
151 iter = goodResults.erase(iter);
152 increaseIter =
false;
165 results = goodResults;
167 B2DEBUG(29,
"CDCCKFDuplicateRemover: " << results.size() <<
" paths created (after merging)");
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());