Belle II Software development
CDCCKFStateCreator.h
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8#pragma once
9
10#include <tracking/trackingUtilities/findlets/base/Findlet.h>
11
12#include <tracking/trackingUtilities/numerics/EForwardBackward.h>
13#include <tracking/ckf/general/utilities/SearchDirection.h>
14
15#include <tracking/ckf/cdc/entities/CDCCKFState.h>
16#include <tracking/ckf/cdc/entities/CDCCKFPath.h>
17
18#include <cdc/topology/CDCWire.h>
19#include <cdc/topology/CDCWireTopology.h>
20
21#include <tracking/trackingUtilities/utilities/StringManipulation.h>
22#include <framework/core/ModuleParamList.h>
23#include <tracking/trackingUtilities/numerics/Angle.h>
24
25#include <Math/Vector3D.h>
26
27
28namespace Belle2 {
33
36 : public TrackingUtilities::Findlet<CDCCKFState, const CDCCKFState,
37 const TrackingUtilities::CDCWireHit* const > {
38
41
47 double phi;
48 };
49
50
51 public:
52
57 void setMaximalLayerJump(int maximalLayerJump) { m_maximalLayerJump = maximalLayerJump; }
58
63 void setMaximalLayerJumpBackwardSeed(int maximalLayerJumpBackwardSeed)
64 {
65 m_maximalLayerJump_backwardSeed = maximalLayerJumpBackwardSeed;
66 }
67
72 void setMaximalDeltaPhi(double maximalDeltaPhi) { m_maximalDeltaPhi = maximalDeltaPhi; }
73
78 void setHitFindingDirection(const std::string& hitFindingDirection)
79 {
80 m_param_writeOutDirectionAsString = hitFindingDirection;
81 }
82
84 void exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix) override
85 {
86 moduleParamList->addParameter(TrackingUtilities::prefixed(prefix, "maximalLayerJump"),
87 m_maximalLayerJump, "Maximal jump over N layers", m_maximalLayerJump);
88 moduleParamList->addParameter(TrackingUtilities::prefixed(prefix, "maximalLayerJumpBackwardSeed"),
90 moduleParamList->addParameter(TrackingUtilities::prefixed(prefix, "maximalDeltaPhi"),
91 m_maximalDeltaPhi, "Maximal distance in phi between wires for Z=0 plane", m_maximalDeltaPhi);
92 moduleParamList->addParameter(TrackingUtilities::prefixed(prefix, "hitFindingDirection"),
93 m_param_writeOutDirectionAsString, "Start from innermost/outermost CDC layers", m_param_writeOutDirectionAsString);
94 }
95
97 void beginEvent() override
98 {
100 m_wireHitCache.clear();
101
102 // Determine direction of track building
104
105 if (m_param_writeOutDirection == TrackingUtilities::EForwardBackward::c_Forward) {
106 doForward = true;
107 } else if (m_param_writeOutDirection == TrackingUtilities::EForwardBackward::c_Backward) {
108 doForward = false;
109 } else {
110 B2FATAL("CDCCKFStateCreator: No valid direction specified. Please use forward/backward.");
111 }
112 }
113
115 void apply(std::vector<CDCCKFState>& nextStates, const CDCCKFPath& path,
116 const std::vector<const TrackingUtilities::CDCWireHit*>& wireHits) override
117 {
118 // TODO: as we do not need any information on the current state (track state) of the path, we could in principle
119 // TODO: precalculate everything in here
120
121 // Create cache over wirehits, if empty:
122 if (m_wireHitCache.empty()) {
123 const size_t nHits = wireHits.size();
124 m_wireHitCache.reserve(nHits);
125 for (auto hitPtr : wireHits) {
126 // to speed things up, don't consider background/taken hits at all (and not just in the loop below).
127 // I can't just remove them from the list, otherwise the relation to the wireHits is broken
128 // so set the layer index to a high number.
129 if (hitPtr->getAutomatonCell().hasBackgroundFlag() || hitPtr->getAutomatonCell().hasTakenFlag()) {
130 m_wireHitCache.push_back(CDCCKFWireHitCache{99999, 0.});
131 } else {
132 m_wireHitCache.push_back(CDCCKFWireHitCache{hitPtr->getWire().getICLayer(), hitPtr->getRefPos2D().Phi()});
133 }
134 }
135 }
136
137 // Cache last-on-the-path state info too:
138 const auto& lastState = path.back();
139 double lastPhi = 0;
140 double lastICLayer = -1;
141 if (lastState.isSeed()) {
142 if (doForward) {
143 lastICLayer = 0;
144 } else {
145 const auto& wireTopology = CDC::CDCWireTopology::getInstance();
146 const auto& wires = wireTopology.getWires();
147 const float maxForwardZ = wires.back().getForwardZ(); // 157.615
148 const float maxBackwardZ = wires.back().getBackwardZ(); // -72.0916
149
150 const ROOT::Math::XYZVector seedPos(lastState.getSeed()->getPositionSeed());
151 const float seedPosZ = seedPos.z();
152
153 if (seedPosZ < maxForwardZ && seedPosZ > maxBackwardZ) {
154 lastICLayer = 56;
155 } else {
156 // do straight extrapolation of seed momentum to CDC outer walls
157 ROOT::Math::XYZVector seedMomZOne(lastState.getSeed()->getMomentumSeed());
158 seedMomZOne = seedMomZOne / seedMomZOne.z();
159 // const float maxZ = seedPosZ > 0 ? maxForwardZ : maxBackwardZ;
160 // const ROOT::Math::XYZVector extrapolatedPos = seedPos - seedMom / seedMom.R() * (seedPosZ - maxZ);
161
162 // find closest iCLayer
163 float minDist = 99999;
164 for (const auto& wire : wires) {
165 const float maxZ = seedPosZ > 0 ? wire.getForwardZ() : wire.getBackwardZ();
166 const ROOT::Math::XYZVector extrapolatedPos = seedPos - seedMomZOne * (seedPosZ - maxZ);
167
168 const auto distance = wire.getDistance(extrapolatedPos);
169 if (distance < minDist) {
170 minDist = distance;
171 lastICLayer = wire.getICLayer();
172 }
173 }
174 B2DEBUG(29, lastICLayer << " (d=" << minDist << ")");
175 }
176 }
177 } else {
178 lastPhi = lastState.getWireHit()->getRefPos2D().Phi();
179 lastICLayer = lastState.getWireHit()->getWire().getICLayer();
180 }
181
182 // Get sorted vector of wireHits on the path for faster search
183 std::vector<const TrackingUtilities::CDCWireHit*> wireHitsOnPath;
184 for (auto const& state : path) {
185 if (! state.isSeed()) {
186 wireHitsOnPath.push_back(state.getWireHit());
187 }
188 }
189 std::sort(wireHitsOnPath.begin(), wireHitsOnPath.end());
190
191 size_t nHits = wireHits.size();
192 for (size_t i = 0; i < nHits; i++) {
193 // adjust direction of loop (minimal speed gain)
194 int idx = doForward ? i : nHits - i - 1;
195
196 const auto iCLayer = m_wireHitCache[idx].icLayer; // wireHit->getWire().getICLayer();
197 if (m_param_writeOutDirection == TrackingUtilities::EForwardBackward::c_Backward && lastState.isSeed()) {
198 if (std::abs(lastICLayer - iCLayer) > m_maximalLayerJump_backwardSeed) {
199 continue;
200 }
201 } else if (std::abs(lastICLayer - iCLayer) > m_maximalLayerJump) {
202 continue;
203 }
204
205 if (! lastState.isSeed()) {
206 double deltaPhi = TrackingUtilities::AngleUtil::normalised(lastPhi - m_wireHitCache[idx].phi);
207 if (fabs(deltaPhi) > m_maximalDeltaPhi) {
208 continue;
209 }
210 }
211
212 const TrackingUtilities::CDCWireHit* wireHit = wireHits[idx];
213
214 if (std::binary_search(wireHitsOnPath.begin(), wireHitsOnPath.end(), wireHit)) {
215 continue;
216 }
217
218 nextStates.emplace_back(wireHit);
219 }
220 }
221
222 private:
228 double m_maximalDeltaPhi = TMath::Pi() / 8;
230 std::string m_param_writeOutDirectionAsString = "forward";
232 TrackingUtilities::EForwardBackward m_param_writeOutDirection = TrackingUtilities::EForwardBackward::c_Unknown;
234 bool doForward = true;
235
237 std::vector<CDCCKFWireHitCache> m_wireHitCache = {};
238
239 };
240
241}
Create CKF states, based on the current path. Perform some basic selection at this stage (based on ph...
TrackingUtilities::Findlet< CDCCKFState, const CDCCKFState, const TrackingUtilities::CDCWireHit *const > Super
Parent class.
TrackingUtilities::EForwardBackward m_param_writeOutDirection
Direction parameter converted from the string parameters.
void setMaximalLayerJump(int maximalLayerJump)
Set maximal layer jump for state creation.
double m_maximalDeltaPhi
Maximal distance in phi between the path last hit/seed and the candidate hit.
int m_maximalLayerJump_backwardSeed
Maximum allowed step over layers (if outside->in CKF) for first step after seed (e....
int m_maximalLayerJump
Maximum allowed step over layers.
bool doForward
Direction parameter converted to boolean for convenience.
std::vector< CDCCKFWireHitCache > m_wireHitCache
Cache to store frequently used information.
void setMaximalDeltaPhi(double maximalDeltaPhi)
Set maximal delta phi for state creation.
void setMaximalLayerJumpBackwardSeed(int maximalLayerJumpBackwardSeed)
Set maximal layer jump for backward seed tracks.
void beginEvent() override
Clear the wireHit cache.
void apply(std::vector< CDCCKFState > &nextStates, const CDCCKFPath &path, const std::vector< const TrackingUtilities::CDCWireHit * > &wireHits) override
Main method of the findlet. Select + create states (output parameter nextStates) suitable for the inp...
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) override
Expose the parameters of the sub findlets.
std::string m_param_writeOutDirectionAsString
Parameter for the direction in which the tracks are built.
void setHitFindingDirection(const std::string &hitFindingDirection)
Set hit finding direction.
static CDCWireTopology & getInstance()
Getter for the singleton instance of the wire topology.
The Module parameter list class.
Class representing a hit wire in the central drift chamber.
Definition CDCWireHit.h:56
void beginEvent() override
Receive and dispatch signal for the start of a new event.
Interface for a minimal algorithm part that wants to expose some parameters to a module.
Definition Findlet.h:26
void addParameter(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module list.
std::vector< CDCCKFState > CDCCKFPath
Shortcut for the collection of CDC CKF-algorithm states.
Definition CDCCKFPath.h:19
TrackingUtilities::EForwardBackward fromString(const std::string &directionString)
Helper function to turn a direction string into a valid forward backward information.
Abstract base class for different kinds of events.
Store basic wire info for faster access.
static double normalised(const double angle)
Normalise an angle to lie in the range from [-pi, pi].
Definition Angle.h:33