Belle II Software  release-08-01-10
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 
30 using namespace Belle2;
31 using namespace TrackFindingCDC;
32 
34  : m_fromSegment(nullptr)
35  , m_toSegment(nullptr)
36 {
37 }
38 
39 CDCSegmentPair::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 
83 std::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.
const CDCSegment2D * getFromSegment() const
Getter for the from 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.
CDCTrajectory3D & getTrajectory3D() const
Getter for the three dimensional trajectory.
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.
AutomatonCell & getAutomatonCell() const
Mutable getter for the automaton cell.
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.
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 compatability.
ISuperLayer getToISuperLayer() const
Getter for the superlayer id of the to segment.
const CDCSegment2D * getToSegment() const
Getter for 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.
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 handeling of orientation relat...
Definition: Vector2D.h:35
double angleWith(const Vector2D &rhs) const
The angle between this and rhs.
Definition: Vector2D.h:209
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