8#include <tracking/trackingUtilities/eventdata/tracks/CDCSegmentPair.h>
10#include <tracking/trackingUtilities/eventdata/segments/CDCSegment2D.h>
11#include <tracking/trackingUtilities/eventdata/hits/CDCRecoHit2D.h>
12#include <tracking/trackingUtilities/eventdata/trajectories/CDCTrajectory3D.h>
13#include <tracking/trackingUtilities/eventdata/trajectories/CDCTrajectory2D.h>
14#include <tracking/trackingUtilities/eventdata/trajectories/CDCTrajectorySZ.h>
16#include <cdc/topology/EStereoKind.h>
17#include <cdc/topology/ISuperLayer.h>
20#include <tracking/trackingUtilities/ca/AutomatonCell.h>
22#include <tracking/trackingUtilities/numerics/EForwardBackward.h>
24#include <framework/logging/Logger.h>
26#include <Math/Vector2D.h>
27#include <Math/VectorUtil.h>
34using namespace TrackingUtilities;
40 B2ASSERT(
"CDCSegmentPair initialized with nullptr as from segment", fromSegment);
41 B2ASSERT(
"CDCSegmentPair initialized with nullptr as to segment", toSegment);
51 B2ASSERT(
"CDCSegmentPair initialized with nullptr as from segment", fromSegment);
52 B2ASSERT(
"CDCSegmentPair initialized with nullptr as to segment", toSegment);
64 return getToSegment() ==
nullptr ? EStereoKind::c_Invalid
98 const bool toHits =
true;
106 const bool toHits =
true;
113 const bool fromHits =
true;
128 if (not ptrFromSegment) {
132 if (not ptrToSegment) {
139 if (fromSegment.empty() or toSegment.empty()) {
143 const CDCRecoHit2D& lastRecoHit_fromSegment = fromSegment.back();
144 const CDCRecoHit2D& firstRecoHit_toSegment = toSegment.front();
146 const ROOT::Math::XYVector lastPos2D_fromSegment = lastRecoHit_fromSegment.
getRecoPos2D();
147 const ROOT::Math::XYVector firstPos2D_toSegment = firstRecoHit_toSegment.
getRecoPos2D();
149 return ROOT::Math::VectorUtil::DeltaPhi(lastPos2D_fromSegment, firstPos2D_toSegment);
157 if (not ptrFromSegment) {
161 if (not ptrToSegment) {
168 if (fromSegment.empty() or toSegment.empty()) {
172 const CDCRecoHit2D& firstRecoHit_fromSegment = fromSegment.front();
173 const CDCRecoHit2D& lastRecoHit_fromSegment = fromSegment.back();
175 const CDCRecoHit2D& firstRecoHit_toSegment = toSegment.front();
177 const ROOT::Math::XYVector firstPos2D_fromSegment = firstRecoHit_fromSegment.
getRecoPos2D();
178 const ROOT::Math::XYVector lastPos2D_fromSegment = lastRecoHit_fromSegment.
getRecoPos2D();
179 const ROOT::Math::XYVector firstPos2D_toSegment = firstRecoHit_toSegment.
getRecoPos2D();
181 ROOT::Math::XYVector firstToLast_fromSegment = lastPos2D_fromSegment - firstPos2D_fromSegment;
182 ROOT::Math::XYVector firstToFirst = firstPos2D_toSegment - firstPos2D_fromSegment;
184 return ROOT::Math::VectorUtil::DeltaPhi(firstToLast_fromSegment, firstToFirst);
192 if (not ptrFromSegment) {
196 if (not ptrToSegment) {
203 if (fromSegment.empty() or toSegment.empty()) {
207 const CDCRecoHit2D& lastRecoHit_fromSegment = fromSegment.back();
209 const CDCRecoHit2D& firstRecoHit_toSegment = toSegment.front();
210 const CDCRecoHit2D& lastRecoHit_toSegment = toSegment.back();
212 const ROOT::Math::XYVector lastPos2D_fromSegment = lastRecoHit_fromSegment.
getRecoPos2D();
213 const ROOT::Math::XYVector firstPos2D_toSegment = firstRecoHit_toSegment.
getRecoPos2D();
214 const ROOT::Math::XYVector lastPos2D_toSegment = lastRecoHit_toSegment.
getRecoPos2D();
216 ROOT::Math::XYVector firstToLast_toSegment = lastPos2D_toSegment - firstPos2D_toSegment;
217 ROOT::Math::XYVector lastToLast = lastPos2D_toSegment - lastPos2D_fromSegment;
219 return ROOT::Math::VectorUtil::DeltaPhi(firstToLast_toSegment, lastToLast);
227 if (not ptrFromSegment) {
231 if (not ptrToSegment) {
238 if (fromSegment.empty() or toSegment.empty()) {
242 const CDCRecoHit2D& firstRecoHit_fromSegment = fromSegment.front();
243 const CDCRecoHit2D& lastRecoHit_fromSegment = fromSegment.back();
245 const CDCRecoHit2D& firstRecoHit_toSegment = toSegment.front();
246 const CDCRecoHit2D& lastRecoHit_toSegment = toSegment.back();
248 const ROOT::Math::XYVector firstPos2D_fromSegment = firstRecoHit_fromSegment.
getRecoPos2D();
249 const ROOT::Math::XYVector lastPos2D_fromSegment = lastRecoHit_fromSegment.
getRecoPos2D();
251 const ROOT::Math::XYVector firstPos2D_toSegment = firstRecoHit_toSegment.
getRecoPos2D();
252 const ROOT::Math::XYVector lastPos2D_toSegment = lastRecoHit_toSegment.
getRecoPos2D();
254 ROOT::Math::XYVector firstToLast_fromSegment = lastPos2D_fromSegment - firstPos2D_fromSegment;
255 ROOT::Math::XYVector firstToLast_toSegment = lastPos2D_toSegment - firstPos2D_toSegment;
257 return ROOT::Math::VectorUtil::DeltaPhi(firstToLast_fromSegment, firstToLast_toSegment);
265 if (fromIsCoaligned == EForwardBackward::c_Forward and
266 toIsCoaligned == EForwardBackward::c_Forward) {
267 return EForwardBackward::c_Forward;
268 }
else if (fromIsCoaligned == EForwardBackward::c_Backward and
269 toIsCoaligned == EForwardBackward::c_Backward) {
270 return EForwardBackward::c_Backward;
272 return EForwardBackward::c_Invalid;
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.
ROOT::Math::XYVector getRecoPos2D() const
Getter for the position in the reference plane.
A reconstructed sequence of two dimensional hits in one super layer.
double computeToIsAfterFromFitless() const
Indicator if the from segment lies before the to segment, build without using the trajectories,...
CDCTrajectory3D m_trajectory3D
Memory for the common three dimensional trajectory.
CDC::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.
const CDCSegment2D * m_toSegment
Reference to the to segment.
CDCSegmentPair()=default
Default constructor - for ROOT compatibility.
CDC::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.
CDC::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.
CDC::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 * m_fromSegment
Reference to the from segment.
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.
EStereoKind
Type for the stereo property of the wire.
signed short ISuperLayer
The type of the layer and superlayer ids.
Abstract base class for different kinds of events.
static const ISuperLayer c_Invalid
Constant making an invalid superlayer id.