Belle II Software release-11-00-00
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
26namespace Belle2 {
31
34 : public TrackingUtilities::Findlet<CDCCKFState, const CDCCKFState,
35 const TrackingUtilities::CDCWireHit* const > {
36
39
45 double phi;
46 };
47
48
49 public:
50
55 void setMaximalLayerJump(int maximalLayerJump) { m_maximalLayerJump = maximalLayerJump; }
56
61 void setMaximalLayerJumpBackwardSeed(int maximalLayerJumpBackwardSeed)
62 {
63 m_maximalLayerJump_backwardSeed = maximalLayerJumpBackwardSeed;
64 }
65
70 void setMaximalDeltaPhi(double maximalDeltaPhi) { m_maximalDeltaPhi = maximalDeltaPhi; }
71
76 void setHitFindingDirection(const std::string& hitFindingDirection)
77 {
78 m_param_writeOutDirectionAsString = hitFindingDirection;
79 }
80
82 void exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix) override
83 {
84 moduleParamList->addParameter(TrackingUtilities::prefixed(prefix, "maximalLayerJump"),
85 m_maximalLayerJump, "Maximal jump over N layers", m_maximalLayerJump);
86 moduleParamList->addParameter(TrackingUtilities::prefixed(prefix, "maximalLayerJumpBackwardSeed"),
88 moduleParamList->addParameter(TrackingUtilities::prefixed(prefix, "maximalDeltaPhi"),
89 m_maximalDeltaPhi, "Maximal distance in phi between wires for Z=0 plane", m_maximalDeltaPhi);
90 moduleParamList->addParameter(TrackingUtilities::prefixed(prefix, "hitFindingDirection"),
91 m_param_writeOutDirectionAsString, "Start from innermost/outermost CDC layers", m_param_writeOutDirectionAsString);
92
93 moduleParamList->addParameter(TrackingUtilities::prefixed(prefix, "firstActiveCDCLayer"),
94 m_firstActiveCDCLayer, "First CDC layer which is active (i.e. considered for layer jumps)", m_firstActiveCDCLayer);
95 }
96
98 void beginEvent() override
99 {
101 m_wireHitCache.clear();
102
103 // Determine direction of track building
105
106 if (m_param_writeOutDirection == TrackingUtilities::EForwardBackward::c_Forward) {
107 doForward = true;
108 } else if (m_param_writeOutDirection == TrackingUtilities::EForwardBackward::c_Backward) {
109 doForward = false;
110 } else {
111 B2FATAL("CDCCKFStateCreator: No valid direction specified. Please use forward/backward.");
112 }
113 }
114
116 void apply(std::vector<CDCCKFState>& nextStates, const CDCCKFPath& path,
117 const std::vector<const TrackingUtilities::CDCWireHit*>& wireHits) override
118 {
119 // TODO: as we do not need any information on the current state (track state) of the path, we could in principle
120 // TODO: precalculate everything in here
121
122 // Create cache over wirehits, if empty:
123 if (m_wireHitCache.empty()) {
124 const size_t nHits = wireHits.size();
125 m_wireHitCache.reserve(nHits);
126 for (auto hitPtr : wireHits) {
127 // to speed things up, don't consider background/taken hits at all (and not just in the loop below).
128 // I can't just remove them from the list, otherwise the relation to the wireHits is broken
129 // so set the layer index to a high number.
130 if (hitPtr->getAutomatonCell().hasBackgroundFlag() || hitPtr->getAutomatonCell().hasTakenFlag()) {
131 m_wireHitCache.push_back(CDCCKFWireHitCache{99999, 0.});
132 } else {
133 m_wireHitCache.push_back(CDCCKFWireHitCache{hitPtr->getWire().getICLayer(), hitPtr->getRefPos2D().phi()});
134 }
135 }
136 }
137
138 // Cache last-on-the-path state info too:
139 const auto& lastState = path.back();
140 double lastPhi = 0;
141 double lastICLayer = -1;
142 if (lastState.isSeed()) {
143 if (doForward) {
144 lastICLayer = m_firstActiveCDCLayer; // if SL0 and SL1 turned off this 14, nominal 0
145 } else {
146 const auto& wireTopology = CDC::CDCWireTopology::getInstance();
147 const auto& wires = wireTopology.getWires();
148 const float maxForwardZ = wires.back().getForwardZ(); // 157.615
149 const float maxBackwardZ = wires.back().getBackwardZ(); // -72.0916
150
151 const TrackingUtilities::Vector3D seedPos(lastState.getSeed()->getPositionSeed());
152 const float seedPosZ = seedPos.z();
153
154 if (seedPosZ < maxForwardZ && seedPosZ > maxBackwardZ) {
155 lastICLayer = 56;
156 } else {
157 // do straight extrapolation of seed momentum to CDC outer walls
158 TrackingUtilities::Vector3D seedMomZOne(lastState.getSeed()->getMomentumSeed());
159 seedMomZOne = seedMomZOne / seedMomZOne.z();
160 // const float maxZ = seedPosZ > 0 ? maxForwardZ : maxBackwardZ;
161 // const TrackingUtilities::Vector3D extrapolatedPos = seedPos - seedMom / seedMom.norm() * (seedPosZ - maxZ);
162
163 // find closest iCLayer
164 float minDist = 99999;
165 for (const auto& wire : wires) {
166 const float maxZ = seedPosZ > 0 ? wire.getForwardZ() : wire.getBackwardZ();
167 const TrackingUtilities::Vector3D extrapolatedPos = seedPos - seedMomZOne * (seedPosZ - maxZ);
168
169 const auto distance = wire.getDistance(extrapolatedPos);
170 if (distance < minDist) {
171 minDist = distance;
172 lastICLayer = wire.getICLayer();
173 }
174 }
175 B2DEBUG(29, lastICLayer << " (d=" << minDist << ")");
176 }
177 }
178 } else {
179 lastPhi = lastState.getWireHit()->getRefPos2D().phi();
180 lastICLayer = lastState.getWireHit()->getWire().getICLayer();
181 }
182
183 // Get sorted vector of wireHits on the path for faster search
184 std::vector<const TrackingUtilities::CDCWireHit*> wireHitsOnPath;
185 for (auto const& state : path) {
186 if (! state.isSeed()) {
187 wireHitsOnPath.push_back(state.getWireHit());
188 }
189 }
190 std::sort(wireHitsOnPath.begin(), wireHitsOnPath.end());
191
192 size_t nHits = wireHits.size();
193 for (size_t i = 0; i < nHits; i++) {
194 // adjust direction of loop (minimal speed gain)
195 int idx = doForward ? i : nHits - i - 1;
196
197 const auto iCLayer = m_wireHitCache[idx].icLayer; // wireHit->getWire().getICLayer();
198 if (m_param_writeOutDirection == TrackingUtilities::EForwardBackward::c_Backward && lastState.isSeed()) {
199 if (std::abs(lastICLayer - iCLayer) > m_maximalLayerJump_backwardSeed) {
200 continue;
201 }
202 } else if (std::abs(lastICLayer - iCLayer) > m_maximalLayerJump) {
203 continue;
204 }
205
206 if (! lastState.isSeed()) {
207 double deltaPhi = TrackingUtilities::AngleUtil::normalised(lastPhi - m_wireHitCache[idx].phi);
208 if (fabs(deltaPhi) > m_maximalDeltaPhi) {
209 continue;
210 }
211 }
212
213 const TrackingUtilities::CDCWireHit* wireHit = wireHits[idx];
214
215 if (std::binary_search(wireHitsOnPath.begin(), wireHitsOnPath.end(), wireHit)) {
216 continue;
217 }
218
219 nextStates.emplace_back(wireHit);
220 }
221 }
222
223 private:
231 double m_maximalDeltaPhi = TMath::Pi() / 8;
233 std::string m_param_writeOutDirectionAsString = "forward";
235 TrackingUtilities::EForwardBackward m_param_writeOutDirection = TrackingUtilities::EForwardBackward::c_Unknown;
237 bool doForward = true;
238
240 std::vector<CDCCKFWireHitCache> m_wireHitCache = {};
241
242 };
243
244}
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.
int m_firstActiveCDCLayer
First active inner CDC layer (0 for default Belle II, 14 if SL0 and SL1 deactivated)
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:58
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
A three dimensional vector.
Definition Vector3D.h:34
double z() const
Getter for the z coordinate.
Definition Vector3D.h:497
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