12 #include <tracking/trackFindingCDC/findlets/base/Findlet.h>
14 #include <tracking/trackFindingCDC/numerics/EForwardBackward.h>
15 #include <tracking/ckf/general/utilities/SearchDirection.h>
17 #include <tracking/ckf/cdc/entities/CDCCKFState.h>
18 #include <tracking/ckf/cdc/entities/CDCCKFPath.h>
20 #include <tracking/trackFindingCDC/topology/CDCWire.h>
21 #include <tracking/trackFindingCDC/topology/CDCWireTopology.h>
23 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
24 #include <framework/core/ModuleParamList.h>
25 #include <tracking/trackFindingCDC/numerics/Angle.h>
34 class CDCCKFStateCreator
36 :
public TrackFindingCDC::Findlet<CDCCKFState, const CDCCKFState,
37 const TrackFindingCDC::CDCWireHit* const > {
40 using Super = TrackFindingCDC::Findlet<CDCCKFState, const CDCCKFState, const TrackFindingCDC::CDCWireHit* const>;
56 moduleParamList->
addParameter(TrackFindingCDC::prefixed(prefix,
"maximalLayerJump"),
58 moduleParamList->
addParameter(TrackFindingCDC::prefixed(prefix,
"maximalLayerJumpBackwardSeed"),
60 moduleParamList->
addParameter(TrackFindingCDC::prefixed(prefix,
"maximalDeltaPhi"),
62 moduleParamList->
addParameter(TrackFindingCDC::prefixed(prefix,
"hitFindingDirection"),
80 B2FATAL(
"CDCCKFStateCreator: No valid direction specified. Please use forward/backward.");
85 void apply(std::vector<CDCCKFState>& nextStates,
const CDCCKFPath& path,
86 const std::vector<const TrackFindingCDC::CDCWireHit*>& wireHits)
override
93 const size_t nHits = wireHits.size();
95 for (
auto hitPtr : wireHits) {
99 if (hitPtr->getAutomatonCell().hasBackgroundFlag() || hitPtr->getAutomatonCell().hasTakenFlag()) {
108 const auto& lastState = path.back();
110 double lastICLayer = -1;
111 if (lastState.isSeed()) {
116 const auto& wires = wireTopology.getWires();
117 const float maxForwardZ = wires.back().getForwardZ();
118 const float maxBackwardZ = wires.back().getBackwardZ();
121 const float seedPosZ = seedPos.z();
123 if (seedPosZ < maxForwardZ && seedPosZ > maxBackwardZ) {
128 seedMomZOne = seedMomZOne / seedMomZOne.z();
133 float minDist = 99999;
134 for (
const auto& wire : wires) {
135 const float maxZ = seedPosZ > 0 ? wire.getForwardZ() : wire.getBackwardZ();
138 const auto distance = wire.getDistance(extrapolatedPos);
139 if (distance < minDist) {
141 lastICLayer = wire.getICLayer();
144 B2DEBUG(100, lastICLayer <<
" (d=" << minDist <<
")");
148 lastPhi = lastState.getWireHit()->getRefPos2D().phi();
149 lastICLayer = lastState.getWireHit()->getWire().getICLayer();
153 std::vector<const TrackFindingCDC::CDCWireHit*> wireHitsOnPath;
154 for (
auto const& state : path) {
155 if (! state.isSeed()) {
156 wireHitsOnPath.push_back(state.getWireHit());
159 std::sort(wireHitsOnPath.begin(), wireHitsOnPath.end());
161 size_t nHits = wireHits.size();
162 for (
size_t i = 0; i < nHits; i++) {
175 if (! lastState.isSeed()) {
182 const TrackFindingCDC::CDCWireHit* wireHit = wireHits[idx];
184 if (std::binary_search(wireHitsOnPath.begin(), wireHitsOnPath.end(), wireHit)) {
188 nextStates.emplace_back(wireHit);