10 #include <tracking/trackFindingCDC/findlets/minimal/SegmentAliasResolver.h>
12 #include <tracking/trackFindingCDC/fitting/CDCObservations2D.h>
14 #include <tracking/trackFindingCDC/eventdata/segments/CDCSegment2D.h>
15 #include <tracking/trackFindingCDC/eventdata/segments/CDCFacetSegment.h>
16 #include <tracking/trackFindingCDC/eventdata/segments/CDCRLWireHitSegment.h>
17 #include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
19 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
21 #include <framework/core/ModuleParamList.templateDetails.h>
26 using namespace TrackFindingCDC;
29 void swapBetterChi2(CDCSegment2D& segment, CDCSegment2D& aliasSegment)
31 const CDCTrajectory2D& aliasTrajectory2D = aliasSegment.getTrajectory2D();
32 if (aliasTrajectory2D.isFitted() and
33 aliasTrajectory2D.getChi2() < segment.getTrajectory2D().getChi2()) {
34 aliasSegment.setAliasScore(NAN);
35 std::swap(segment, aliasSegment);
42 return "Resolves the rl aliasing of segments in various scenarios";
47 moduleParamList->
addParameter(prefixed(prefix,
"investigateAlias"),
49 "Which alias resolutions should be applied. "
50 "Options are trailing_hit, last_hit, full.",
53 moduleParamList->
addParameter(prefixed(prefix,
"reestimateDriftLength"),
55 "Switch to reestimate the drift length in the alias resolver",
58 moduleParamList->
addParameter(prefixed(prefix,
"reestimatePositions"),
60 "Switch to reestimate the reconstructed positions in the alias resolver",
68 if (investigatedAlias ==
"full") {
70 }
else if (investigatedAlias ==
"cross") {
72 }
else if (investigatedAlias ==
"borders") {
74 }
else if (investigatedAlias ==
"middle") {
77 B2ERROR(
"Unknown alias to investigate " << investigatedAlias);
86 if (segment->hasAliasFlag())
continue;
87 int nRLSwitches = segment.getNRLSwitches();
89 bool aliasStable = nRLSwitches > 2;
90 if (aliasStable)
continue;
93 refit(aliasSegment,
true);
94 swapBetterChi2(segment, aliasSegment);
101 int nRLSwitches = segment.getNRLSwitches();
103 bool aliasStable = nRLSwitches > 2;
104 if (aliasStable)
continue;
106 if (nRLSwitches == 1) {
111 if (recoHit2D.getRLInfo() == ERightLeft::c_Left) {
112 recoHit2D = recoHit2D.getAlias();
117 if (recoHit2D.getRLInfo() == ERightLeft::c_Right) {
118 recoHit2D = recoHit2D.getAlias();
121 refit(rightSegment,
true);
122 refit(leftSegment,
true);
123 swapBetterChi2(segment, rightSegment);
124 swapBetterChi2(segment, leftSegment);
126 }
else if (nRLSwitches == 0) {
137 auto itMinLRecoHit2D =
138 std::min_element(frontCrossSegment.begin(), frontCrossSegment.end(), lessDriftLength);
139 for (
CDCRecoHit2D& recoHit2D : asRange(frontCrossSegment.begin(), itMinLRecoHit2D)) {
140 recoHit2D = recoHit2D.getAlias();
146 auto itMinLRecoHit2D =
147 std::min_element(backCrossSegment.begin(), backCrossSegment.end(), lessDriftLength);
148 for (
CDCRecoHit2D& recoHit2D : asRange(itMinLRecoHit2D, backCrossSegment.end())) {
149 recoHit2D = recoHit2D.getAlias();
152 refit(frontCrossSegment,
true);
153 refit(backCrossSegment,
true);
154 swapBetterChi2(segment, frontCrossSegment);
155 swapBetterChi2(segment, backCrossSegment);
168 refit(aliasSegment,
false);
173 swapBetterChi2(segment, aliasSegment);
184 refit(aliasSegment,
false);
189 swapBetterChi2(segment, aliasSegment);
200 double minimalDriftLength = 0.1;
203 if (aliasHit.getRefDriftLength() < minimalDriftLength) {
204 minimalHit = &aliasHit;
212 refit(aliasSegment,
false);
217 swapBetterChi2(segment, aliasSegment);
222 std::sort(outputSegments.begin(), outputSegments.end());
232 rlWireHit.setRefDriftLength(rlWireHit.getWireHit().getRefDriftLength());
235 for (
CDCFacet& facet : facetSegment) {
236 facet.adjustFitLine();
242 segment = replacement;
250 const EFitPos fitPos = EFitPos::c_RecoPos;
251 const EFitVariance fitVariance = EFitVariance::c_Proper;
254 if (observations2D.
size() < 4) {
255 segment.getTrajectory2D().clear();
258 segment.setTrajectory2D(trajectory2D);