Belle II Software development
CDCSegmentPair.cc
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#include <tracking/trackFindingCDC/eventdata/tracks/CDCSegmentPair.h>
9
10#include <tracking/trackFindingCDC/eventdata/segments/CDCSegment2D.h>
11#include <tracking/trackFindingCDC/eventdata/hits/CDCRecoHit2D.h>
12#include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory3D.h>
13#include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory2D.h>
14#include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectorySZ.h>
15
16#include <tracking/trackFindingCDC/topology/EStereoKind.h>
17#include <tracking/trackFindingCDC/topology/ISuperLayer.h>
18
19#include <tracking/trackFindingCDC/geometry/Vector2D.h>
20
21#include <tracking/trackFindingCDC/ca/AutomatonCell.h>
22
23#include <tracking/trackFindingCDC/numerics/EForwardBackward.h>
24
25#include <framework/logging/Logger.h>
26
27#include <memory>
28#include <cmath>
29
30using namespace Belle2;
31using namespace TrackFindingCDC;
32
34 : m_fromSegment(nullptr)
35 , m_toSegment(nullptr)
36{
37}
38
39CDCSegmentPair::CDCSegmentPair(const CDCSegment2D* fromSegment, const CDCSegment2D* toSegment)
40 : m_fromSegment(fromSegment)
41 , m_toSegment(toSegment)
42{
43 B2ASSERT("CDCSegmentPair initialized with nullptr as from segment", fromSegment);
44 B2ASSERT("CDCSegmentPair initialized with nullptr as to segment", toSegment);
45}
46
48 const CDCSegment2D* toSegment,
49 const CDCTrajectory3D& trajectory3D)
50 : m_fromSegment(fromSegment)
51 , m_toSegment(toSegment)
52 , m_trajectory3D(trajectory3D)
53{
54 B2ASSERT("CDCSegmentPair initialized with nullptr as from segment", fromSegment);
55 B2ASSERT("CDCSegmentPair initialized with nullptr as to segment", toSegment);
56}
57
58
60{
61 return getFromSegment() == nullptr ? EStereoKind::c_Invalid
62 : getFromSegment()->back().getStereoKind();
63}
64
66{
67 return getToSegment() == nullptr ? EStereoKind::c_Invalid
68 : getToSegment()->front().getStereoKind();
69}
70
72{
73 return getFromSegment() == nullptr ? ISuperLayerUtil::c_Invalid
74 : getFromSegment()->back().getISuperLayer();
75}
76
78{
79 return getToSegment() == nullptr ? ISuperLayerUtil::c_Invalid
80 : getToSegment()->front().getISuperLayer();
81}
82
83std::size_t CDCSegmentPair::size() const
84{
85 return getFromSegment()->size() + getToSegment()->size();
86}
87
89{
91}
92
94{
96}
97
99{
101 const bool toHits = true;
102 getFromSegment()->unsetAndForwardMaskedFlag(toHits);
103 getToSegment()->unsetAndForwardMaskedFlag(toHits);
104}
105
107{
109 const bool toHits = true;
110 getFromSegment()->setAndForwardMaskedFlag(toHits);
111 getToSegment()->setAndForwardMaskedFlag(toHits);
112}
113
115{
116 const bool fromHits = true;
117 getFromSegment()->receiveMaskedFlag(fromHits);
118 getToSegment()->receiveMaskedFlag(fromHits);
119
120 if (getFromSegment()->getAutomatonCell().hasMaskedFlag() or
121 getToSegment()->getAutomatonCell().hasMaskedFlag()) {
123 }
124}
125
127{
128 const CDCSegment2D* ptrFromSegment = getFromSegment();
129 const CDCSegment2D* ptrToSegment = getToSegment();
130
131 if (not ptrFromSegment) {
132 return NAN;
133 }
134
135 if (not ptrToSegment) {
136 return NAN;
137 }
138
139 const CDCSegment2D& fromSegment = *ptrFromSegment;
140 const CDCSegment2D& toSegment = *ptrToSegment;
141
142 if (fromSegment.empty() or toSegment.empty()) {
143 return NAN;
144 }
145
146 const CDCRecoHit2D& lastRecoHit_fromSegment = fromSegment.back();
147 const CDCRecoHit2D& firstRecoHit_toSegment = toSegment.front();
148
149 const Vector2D lastPos2D_fromSegment = lastRecoHit_fromSegment.getRecoPos2D();
150 const Vector2D firstPos2D_toSegment = firstRecoHit_toSegment.getRecoPos2D();
151
152 return lastPos2D_fromSegment.angleWith(firstPos2D_toSegment);
153}
154
156{
157 const CDCSegment2D* ptrFromSegment = getFromSegment();
158 const CDCSegment2D* ptrToSegment = getToSegment();
159
160 if (not ptrFromSegment) {
161 return NAN;
162 }
163
164 if (not ptrToSegment) {
165 return NAN;
166 }
167
168 const CDCSegment2D& fromSegment = *ptrFromSegment;
169 const CDCSegment2D& toSegment = *ptrToSegment;
170
171 if (fromSegment.empty() or toSegment.empty()) {
172 return NAN;
173 }
174
175 const CDCRecoHit2D& firstRecoHit_fromSegment = fromSegment.front();
176 const CDCRecoHit2D& lastRecoHit_fromSegment = fromSegment.back();
177
178 const CDCRecoHit2D& firstRecoHit_toSegment = toSegment.front();
179
180 const Vector2D firstPos2D_fromSegment = firstRecoHit_fromSegment.getRecoPos2D();
181 const Vector2D lastPos2D_fromSegment = lastRecoHit_fromSegment.getRecoPos2D();
182 const Vector2D firstPos2D_toSegment = firstRecoHit_toSegment.getRecoPos2D();
183
184 Vector2D firstToLast_fromSegment = lastPos2D_fromSegment - firstPos2D_fromSegment;
185 Vector2D firstToFirst = firstPos2D_toSegment - firstPos2D_fromSegment;
186
187 return firstToLast_fromSegment.angleWith(firstToFirst);
188}
189
191{
192 const CDCSegment2D* ptrFromSegment = getFromSegment();
193 const CDCSegment2D* ptrToSegment = getToSegment();
194
195 if (not ptrFromSegment) {
196 return NAN;
197 }
198
199 if (not ptrToSegment) {
200 return NAN;
201 }
202
203 const CDCSegment2D& fromSegment = *ptrFromSegment;
204 const CDCSegment2D& toSegment = *ptrToSegment;
205
206 if (fromSegment.empty() or toSegment.empty()) {
207 return NAN;
208 }
209
210 const CDCRecoHit2D& lastRecoHit_fromSegment = fromSegment.back();
211
212 const CDCRecoHit2D& firstRecoHit_toSegment = toSegment.front();
213 const CDCRecoHit2D& lastRecoHit_toSegment = toSegment.back();
214
215 const Vector2D lastPos2D_fromSegment = lastRecoHit_fromSegment.getRecoPos2D();
216 const Vector2D firstPos2D_toSegment = firstRecoHit_toSegment.getRecoPos2D();
217 const Vector2D lastPos2D_toSegment = lastRecoHit_toSegment.getRecoPos2D();
218
219 Vector2D firstToLast_toSegment = lastPos2D_toSegment - firstPos2D_toSegment;
220 Vector2D lastToLast = lastPos2D_toSegment - lastPos2D_fromSegment;
221
222 return firstToLast_toSegment.angleWith(lastToLast);
223}
224
226{
227 const CDCSegment2D* ptrFromSegment = getFromSegment();
228 const CDCSegment2D* ptrToSegment = getToSegment();
229
230 if (not ptrFromSegment) {
231 return NAN;
232 }
233
234 if (not ptrToSegment) {
235 return NAN;
236 }
237
238 const CDCSegment2D& fromSegment = *ptrFromSegment;
239 const CDCSegment2D& toSegment = *ptrToSegment;
240
241 if (fromSegment.empty() or toSegment.empty()) {
242 return NAN;
243 }
244
245 const CDCRecoHit2D& firstRecoHit_fromSegment = fromSegment.front();
246 const CDCRecoHit2D& lastRecoHit_fromSegment = fromSegment.back();
247
248 const CDCRecoHit2D& firstRecoHit_toSegment = toSegment.front();
249 const CDCRecoHit2D& lastRecoHit_toSegment = toSegment.back();
250
251 const Vector2D firstPos2D_fromSegment = firstRecoHit_fromSegment.getRecoPos2D();
252 const Vector2D lastPos2D_fromSegment = lastRecoHit_fromSegment.getRecoPos2D();
253
254 const Vector2D firstPos2D_toSegment = firstRecoHit_toSegment.getRecoPos2D();
255 const Vector2D lastPos2D_toSegment = lastRecoHit_toSegment.getRecoPos2D();
256
257 Vector2D firstToLast_fromSegment = lastPos2D_fromSegment - firstPos2D_fromSegment;
258 Vector2D firstToLast_toSegment = lastPos2D_toSegment - firstPos2D_toSegment;
259
260 return firstToLast_fromSegment.angleWith(firstToLast_toSegment);
261}
262
264{
265 EForwardBackward fromIsCoaligned = trajectory2D.isForwardOrBackwardTo(*(getFromSegment()));
266 EForwardBackward toIsCoaligned = trajectory2D.isForwardOrBackwardTo(*(getToSegment()));
267
268 if (fromIsCoaligned == EForwardBackward::c_Forward and
269 toIsCoaligned == EForwardBackward::c_Forward) {
270 return EForwardBackward::c_Forward;
271 } else if (fromIsCoaligned == EForwardBackward::c_Backward and
272 toIsCoaligned == EForwardBackward::c_Backward) {
273 return EForwardBackward::c_Backward;
274 } else {
275 return EForwardBackward::c_Invalid;
276 }
277}
void setMaskedFlag(bool setTo=true)
Sets the masked flag to the given value. Default value true.
void unsetMaskedFlag()
Resets the masked flag to false.
Class representing a two dimensional reconstructed hit in the central drift chamber.
Definition: CDCRecoHit2D.h:47
Vector2D getRecoPos2D() const
Getter for the position in the reference plane.
Definition: CDCRecoHit2D.h:238
A reconstructed sequence of two dimensional hits in one super layer.
Definition: CDCSegment2D.h:39
double computeToIsAfterFromFitless() const
Indicator if the from segment lies before the to segment, build without using the trajectories,...
EStereoKind getToStereoKind() const
Getter for the stereo type of the second segment.
CDCTrajectory2D getTrajectory2D() const
Getter for the two dimensional projection of the common three dimensional trajectory.
EStereoKind getFromStereoKind() const
Getter for the stereo type of the first segment.
const CDCSegment2D * getToSegment() const
Getter for the to segment.
AutomatonCell & getAutomatonCell() const
Mutable getter for the automaton cell.
void setAndForwardMaskedFlag() const
Sets the masked flag of the segment triple's automaton cell and of the three contained segments.
void unsetAndForwardMaskedFlag() const
Unsets the masked flag of the segment triple's automaton cell and of the three contained segments.
double computeFromIsBeforeToFitless() const
Indicator if the from segment lies before the to segment, build without using the trajectories,...
double computeDeltaPhiAtSuperLayerBound() const
Determines the angle between the last reconstructed position of the from segment and the first recons...
CDCTrajectorySZ getTrajectorySZ() const
Getter for the sz projection of the common three dimensional trajectory.
ISuperLayer getFromISuperLayer() const
Getter for the superlayer id of the from segment.
CDCTrajectory3D & getTrajectory3D() const
Getter for the three dimensional trajectory.
EForwardBackward isCoaligned(const CDCTrajectory2D &trajectory2D) const
Checks if the last entity in the vector lies greater or lower travel distance than the last entity.
CDCSegmentPair()
Default constructor - for ROOT compatibility.
ISuperLayer getToISuperLayer() const
Getter for the superlayer id of the to segment.
std::size_t size() const
Getter for the total number of hits in this segment pair.
void receiveMaskedFlag() const
If one of the contained segments is marked as masked this segment triple is set be masked as well.
const CDCSegment2D * getFromSegment() const
Getter for the from segment.
double computeIsCoalignedFitless() const
Indicator if the from segment and the to segment have roughly the same travel direction without using...
Particle trajectory as it is seen in xy projection represented as a circle.
EForwardBackward isForwardOrBackwardTo(const AHits &hits) const
Calculates if this trajectory and the hits are coaligned Returns:
Particle full three dimensional trajectory.
CDCTrajectory2D getTrajectory2D() const
Getter for the two dimensional trajectory.
CDCTrajectorySZ getTrajectorySZ() const
Getter for the sz trajectory.
Linear trajectory in sz space.
A two dimensional vector which is equipped with functions for correct handling of orientation relate...
Definition: Vector2D.h:32
double angleWith(const Vector2D &rhs) const
The angle between this and rhs.
Definition: Vector2D.h:197
EForwardBackward
Enumeration to represent the distinct possibilities of the right left passage information.
Abstract base class for different kinds of events.
static const ISuperLayer c_Invalid
Constant making an invalid superlayer id.
Definition: ISuperLayer.h:65