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 moduleParamList->addParameter(TrackingUtilities::prefixed(prefix, "firstActiveCDCLayer"),
96 m_firstActiveCDCLayer, "First CDC layer which is active (i.e. considered for layer jumps)", m_firstActiveCDCLayer);
97 }
98
100 void beginEvent() override
101 {
103 m_wireHitCache.clear();
104
105 // Determine direction of track building
107
108 if (m_param_writeOutDirection == TrackingUtilities::EForwardBackward::c_Forward) {
109 doForward = true;
110 } else if (m_param_writeOutDirection == TrackingUtilities::EForwardBackward::c_Backward) {
111 doForward = false;
112 } else {
113 B2FATAL("CDCCKFStateCreator: No valid direction specified. Please use forward/backward.");
114 }
115 }
116
118 void apply(std::vector<CDCCKFState>& nextStates, const CDCCKFPath& path,
119 const std::vector<const TrackingUtilities::CDCWireHit*>& wireHits) override
120 {
121 // TODO: as we do not need any information on the current state (track state) of the path, we could in principle
122 // TODO: precalculate everything in here
123
124 // Create cache over wirehits, if empty:
125 if (m_wireHitCache.empty()) {
126 const size_t nHits = wireHits.size();
127 m_wireHitCache.reserve(nHits);
128 for (auto hitPtr : wireHits) {
129 // to speed things up, don't consider background/taken hits at all (and not just in the loop below).
130 // I can't just remove them from the list, otherwise the relation to the wireHits is broken
131 // so set the layer index to a high number.
132 if (hitPtr->getAutomatonCell().hasBackgroundFlag() || hitPtr->getAutomatonCell().hasTakenFlag()) {
133 m_wireHitCache.push_back(CDCCKFWireHitCache{99999, 0.});
134 } else {
135 m_wireHitCache.push_back(CDCCKFWireHitCache{hitPtr->getWire().getICLayer(), hitPtr->getRefPos2D().Phi()});
136 }
137 }
138 }
139
140 // Cache last-on-the-path state info too:
141 const auto& lastState = path.back();
142 double lastPhi = 0;
143 double lastICLayer = -1;
144 if (lastState.isSeed()) {
145 if (doForward) {
146 lastICLayer = m_firstActiveCDCLayer; // if SL0 and SL1 turned off this 14, nominal 0
147 } else {
148 const auto& wireTopology = CDC::CDCWireTopology::getInstance();
149 const auto& wires = wireTopology.getWires();
150 const float maxForwardZ = wires.back().getForwardZ(); // 157.615
151 const float maxBackwardZ = wires.back().getBackwardZ(); // -72.0916
152
153 const ROOT::Math::XYZVector seedPos(lastState.getSeed()->getPositionSeed());
154 const float seedPosZ = seedPos.z();
155
156 if (seedPosZ < maxForwardZ && seedPosZ > maxBackwardZ) {
157 lastICLayer = 56;
158 } else {
159 // do straight extrapolation of seed momentum to CDC outer walls
160 ROOT::Math::XYZVector seedMomZOne(lastState.getSeed()->getMomentumSeed());
161 seedMomZOne = seedMomZOne / seedMomZOne.z();
162 // const float maxZ = seedPosZ > 0 ? maxForwardZ : maxBackwardZ;
163 // const ROOT::Math::XYZVector extrapolatedPos = seedPos - seedMom / seedMom.R() * (seedPosZ - maxZ);
164
165 // find closest iCLayer
166 float minDist = 99999;
167 for (const auto& wire : wires) {
168 const float maxZ = seedPosZ > 0 ? wire.getForwardZ() : wire.getBackwardZ();
169 const ROOT::Math::XYZVector extrapolatedPos = seedPos - seedMomZOne * (seedPosZ - maxZ);
170
171 const auto distance = wire.getDistance(extrapolatedPos);
172 if (distance < minDist) {
173 minDist = distance;
174 lastICLayer = wire.getICLayer();
175 }
176 }
177 B2DEBUG(29, lastICLayer << " (d=" << minDist << ")");
178 }
179 }
180 } else {
181 lastPhi = lastState.getWireHit()->getRefPos2D().Phi();
182 lastICLayer = lastState.getWireHit()->getWire().getICLayer();
183 }
184
185 // Get sorted vector of wireHits on the path for faster search
186 std::vector<const TrackingUtilities::CDCWireHit*> wireHitsOnPath;
187 for (auto const& state : path) {
188 if (! state.isSeed()) {
189 wireHitsOnPath.push_back(state.getWireHit());
190 }
191 }
192 std::sort(wireHitsOnPath.begin(), wireHitsOnPath.end());
193
194 size_t nHits = wireHits.size();
195 for (size_t i = 0; i < nHits; i++) {
196 // adjust direction of loop (minimal speed gain)
197 int idx = doForward ? i : nHits - i - 1;
198
199 const auto iCLayer = m_wireHitCache[idx].icLayer; // wireHit->getWire().getICLayer();
200 if (m_param_writeOutDirection == TrackingUtilities::EForwardBackward::c_Backward && lastState.isSeed()) {
201 if (std::abs(lastICLayer - iCLayer) > m_maximalLayerJump_backwardSeed) {
202 continue;
203 }
204 } else if (std::abs(lastICLayer - iCLayer) > m_maximalLayerJump) {
205 continue;
206 }
207
208 if (! lastState.isSeed()) {
209 double deltaPhi = TrackingUtilities::AngleUtil::normalised(lastPhi - m_wireHitCache[idx].phi);
210 if (fabs(deltaPhi) > m_maximalDeltaPhi) {
211 continue;
212 }
213 }
214
215 const TrackingUtilities::CDCWireHit* wireHit = wireHits[idx];
216
217 if (std::binary_search(wireHitsOnPath.begin(), wireHitsOnPath.end(), wireHit)) {
218 continue;
219 }
220
221 nextStates.emplace_back(wireHit);
222 }
223 }
224
225 private:
233 double m_maximalDeltaPhi = TMath::Pi() / 8;
235 std::string m_param_writeOutDirectionAsString = "forward";
237 TrackingUtilities::EForwardBackward m_param_writeOutDirection = TrackingUtilities::EForwardBackward::c_Unknown;
239 bool doForward = true;
240
242 std::vector<CDCCKFWireHitCache> m_wireHitCache = {};
243
244 };
245
246}
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: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