12 #include <tracking/trackFindingCDC/findlets/base/Findlet.h>
13 #include <tracking/ckf/cdc/entities/CDCCKFResult.h>
15 #include <ecl/dataobjects/ECLShower.h>
17 #include <tracking/trackFindingCDC/filters/base/ChooseableFilter.h>
18 #include <tracking/ckf/cdc/filters/paths/CDCPathFilterFactory.h>
20 #include <tracking/ckf/cdc/filters/pathPairs/CDCPathPairFilterFactory.h>
21 #include <tracking/trackFindingCDC/filters/base/ChooseableFilter.icc.h>
29 class CDCCKFDuplicateRemover :
public TrackFindingCDC::Findlet<CDCCKFResult> {
33 CDCCKFDuplicateRemover()
43 m_filter_badTracks.exposeParameters(moduleParamList, TrackFindingCDC::prefixed(
"badTracks", prefix));
45 m_filter_duplicateSeed.exposeParameters(moduleParamList, TrackFindingCDC::prefixed(
"duplicateSeed", prefix));
47 moduleParamList->
addParameter(TrackFindingCDC::prefixed(prefix,
"duplicateSeed_maxPhi"),
49 "Seeds within this dPhi can be considered as duplicates (-1 to neglect)",
52 moduleParamList->
addParameter(TrackFindingCDC::prefixed(prefix,
"duplicateSeed_maxTheta"),
54 "Seeds within this dTheta can be considered as duplicates (-1 to neglect)",
59 void apply(std::vector<CDCCKFResult>& results)
override
61 B2DEBUG(100,
"CDCCKFDuplicateRemover: " << results.size() <<
" paths created (might be without any hits)");
63 std::vector<CDCCKFResult> goodResults;
66 TrackFindingCDC::Weight weight;
67 std::unordered_map<double, CDCCKFResult> resultToWeightList;
68 for (
const auto& result : results) {
70 if (not std::isnan(weight)) {
71 goodResults.push_back(result);
75 int n_goodresults = goodResults.size();
77 B2DEBUG(100,
"CDCCKFDuplicateRemover: " << goodResults.size() <<
" paths created (after filtering)");
79 if (n_goodresults > 1) {
80 for (
const auto& result : goodResults) {
81 B2DEBUG(100,
"charge = " << result.front().getSeed()->getChargeSeed() <<
"; "
82 <<
"theta = " << result.front().getSeed()->getPositionSeed().Theta() * 180. / M_PI <<
"; "
83 << (result.size() - 1) <<
" hits (" << result.at(1).getWireHit()->getWire().getICLayer() <<
"->" <<
84 result.back().getWireHit()->getWire().getICLayer() <<
"); "
85 <<
"r/z = " << result.front().getSeed()->getPositionSeed().Perp() <<
"; " << result.front().getSeed()->getPositionSeed().Z());
90 auto iter = goodResults.begin();
91 while (iter < goodResults.end()) {
92 auto iter2 = iter + 1;
93 bool increaseIter =
true;
94 while (iter2 < goodResults.end()) {
96 if (iter2->front().getSeed()->getRelated<ECLShower>() == iter2->front().getSeed()->getRelated<ECLShower>()) {
100 iter2 = goodResults.erase(iter2);
102 iter = goodResults.erase(iter);
103 increaseIter =
false;
115 B2DEBUG(100,
"CDCCKFDuplicateRemover: " << goodResults.size() <<
" paths created (after duplicates)");
117 if (n_goodresults > 1) {
118 for (
const auto& result : goodResults) {
119 B2DEBUG(100,
"charge = " << result.front().getSeed()->getChargeSeed() <<
"; "
120 <<
"theta = " << result.front().getSeed()->getPositionSeed().Theta() * 180. / M_PI <<
"; "
121 << (result.size() - 1) <<
" hits (" << result.at(1).getWireHit()->getWire().getICLayer() <<
"->" <<
122 result.back().getWireHit()->getWire().getICLayer() <<
"); "
123 <<
"r/z = " << result.front().getSeed()->getPositionSeed().Perp() <<
"; " << result.front().getSeed()->getPositionSeed().Z());
129 iter = goodResults.begin();
130 while (iter < goodResults.end()) {
131 double phiClus = iter->front().getSeed()->getPositionSeed().Phi();
132 double thetaClus = iter->front().getSeed()->getPositionSeed().Theta();
134 auto iter2 = iter + 1;
135 bool increaseIter =
true;
136 while (iter2 < goodResults.end()) {
139 if (std::abs(TVector2::Phi_mpi_pi(iter2->front().getSeed()->getPositionSeed().Phi() - phiClus)) <
duplicateSeed_maxPhi
144 B2DEBUG(100,
"Keeping both tracks");
147 B2DEBUG(100,
"Duplicate hits found");
150 iter2 = goodResults.erase(iter2);
152 iter = goodResults.erase(iter);
153 increaseIter =
false;
166 results = goodResults;
168 B2DEBUG(100,
"CDCCKFDuplicateRemover: " << results.size() <<
" paths created (after merging)");
170 if (n_goodresults > 1) {
171 for (
const auto& result : results) {
172 B2DEBUG(100,
"charge = " << result.front().getSeed()->getChargeSeed() <<
"; "
173 <<
"theta = " << result.front().getSeed()->getPositionSeed().Theta() * 180. / M_PI <<
"; "
174 << (result.size() - 1) <<
" hits (" << result.at(1).getWireHit()->getWire().getICLayer() <<
"->" <<
175 result.back().getWireHit()->getWire().getICLayer() <<
"); "
176 <<
"r/z = " << result.front().getSeed()->getPositionSeed().Perp() <<
"; " << result.front().getSeed()->getPositionSeed().Z());