Belle II Software  release-05-01-25
SimpleSegmentPairFilter.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2014 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Oliver Frost *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 #include <tracking/trackFindingCDC/filters/segmentPair/SimpleSegmentPairFilter.h>
11 
12 #include <tracking/trackFindingCDC/fitting/CDCAxialStereoFusion.h>
13 
14 #include <tracking/trackFindingCDC/eventdata/tracks/CDCSegmentPair.h>
15 #include <tracking/trackFindingCDC/eventdata/segments/CDCSegment2D.h>
16 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory3D.h>
17 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory2D.h>
18 
19 #include <tracking/trackFindingCDC/geometry/Vector2D.h>
20 
21 using namespace Belle2;
22 using namespace TrackFindingCDC;
23 
25 {
26  const CDCSegment2D* ptrFromSegment = segmentPair.getFromSegment();
27  const CDCSegment2D* ptrToSegment = segmentPair.getToSegment();
28 
29  assert(ptrFromSegment);
30  assert(ptrToSegment);
31 
32  const CDCSegment2D& fromSegment = *ptrFromSegment;
33  const CDCSegment2D& toSegment = *ptrToSegment;
34 
35  // Do fits
36  const CDCTrajectory2D& fromFit = getFittedTrajectory2D(fromSegment);
37  const CDCTrajectory2D& toFit = getFittedTrajectory2D(toSegment);
38 
39  // Check if segments are coaligned
40  bool toSegmentIsCoaligned = fromFit.getTotalArcLength2D(toSegment) >= 0.0;
41  bool fromSegmentIsCoaligned = toFit.getTotalArcLength2D(fromSegment) >= 0.0;
42 
43  if (not toSegmentIsCoaligned or not fromSegmentIsCoaligned) {
44  return NAN;
45  }
46 
47  // Check if there is a positive gap between from and to segment
48  double fromFitGap = fromFit.getArcLength2DGap(fromSegment, toSegment);
49  double toFitGap = toFit.getArcLength2DGap(fromSegment, toSegment);
50 
51  if (fromFitGap < -5 or fromFitGap > 50 or toFitGap < -5 or toFitGap > 50) {
52  return NAN;
53  }
54 
55  double fromFitFrontOffset = fromFit.getArcLength2DFrontOffset(fromSegment, toSegment);
56  double toFitBackOffset = toFit.getArcLength2DBackOffset(fromSegment, toSegment);
57 
58  if (fromFitFrontOffset < 0 or
59  fromFitFrontOffset > 50 or
60  toFitBackOffset < 0 or
61  toFitBackOffset > 50) {
62  return NAN;
63  }
64 
65  Vector2D fromBackRecoPos2D = fromSegment.back().getRecoPos2D();
66  Vector2D toFrontRecoPos2D = toSegment.front().getRecoPos2D();
67 
68  // Momentum agreement cut
69  Vector2D fromMom2DAtFromBack = fromFit.getFlightDirection2D(fromBackRecoPos2D);
70  Vector2D toMom2DAtToFront = toFit.getFlightDirection2D(toFrontRecoPos2D);
71 
72  Vector2D fromMom2DAtToFront = fromFit.getFlightDirection2D(toFrontRecoPos2D);
73  Vector2D toMom2DAtFromBack = toFit.getFlightDirection2D(fromBackRecoPos2D);
74 
75  double momAngleAtFromBack = fromMom2DAtFromBack.angleWith(toMom2DAtFromBack);
76  double momAngleAtToFront = toMom2DAtToFront.angleWith(fromMom2DAtToFront);
77 
78  if (fabs(momAngleAtToFront) > 1.0 or fabs(momAngleAtFromBack) > 1.0) {
79  return NAN;
80  }
81 
82  // Proximity cut
83  double fromFit_dist2DToFront_toSegment = fromFit.getDist2D(toSegment.front().getRecoPos2D());
84  double toFit_dist2DToBack_fromSegment = toFit.getDist2D(fromSegment.back().getRecoPos2D());
85 
86  if (fromFit_dist2DToFront_toSegment < 10 and toFit_dist2DToBack_fromSegment < 10) {
87  getFittedTrajectory3D(segmentPair);
88  return fromSegment.size() + toSegment.size();
89  } else {
90  return NAN;
91  }
92 }
93 
95 {
96  CDCTrajectory2D& trajectory2D = segment.getTrajectory2D();
97  if (not trajectory2D.isFitted()) {
98  getRiemannFitter().update(trajectory2D, segment);
99  }
100  return trajectory2D;
101 }
102 
104 {
105  const CDCSegment2D* ptrFromSegment = segmentPair.getFromSegment();
106  const CDCSegment2D* ptrToSegment = segmentPair.getToSegment();
107 
108  const CDCSegment2D& fromSegment = *ptrFromSegment;
109  const CDCSegment2D& toSegment = *ptrToSegment;
110 
111  // Do fits if still necessary.
112  getFittedTrajectory2D(fromSegment);
113  getFittedTrajectory2D(toSegment);
114 
115  CDCAxialStereoFusion fusionFit;
116  fusionFit.reconstructFuseTrajectories(segmentPair);
117  return segmentPair.getTrajectory3D();
118 }
Belle2::TrackFindingCDC::CDCTrajectory2D::getArcLength2DFrontOffset
double getArcLength2DFrontOffset(const AFromHits &fromHits, const AToHits &toHits) const
Calculates the perpendicular travel distance from the first position of the fromHits to the first pos...
Definition: CDCTrajectory2D.h:232
Belle2::TrackFindingCDC::CDCTrajectory2D::getTotalArcLength2D
double getTotalArcLength2D(const AHits &hits) const
Calculates the perpendicular travel distance from the first position of the hits to the last position...
Definition: CDCTrajectory2D.h:254
Belle2::TrackFindingCDC::SimpleSegmentPairFilter::getRiemannFitter
const CDCRiemannFitter & getRiemannFitter() const
Returns the xy fitter instance that is used by this filter.
Definition: SimpleSegmentPairFilter.h:52
Belle2::TrackFindingCDC::CDCSegmentPair
Class representing a pair of one reconstructed axial segement and one stereo segment in adjacent supe...
Definition: CDCSegmentPair.h:44
Belle2::TrackFindingCDC::Vector2D
A two dimensional vector which is equipped with functions for correct handeling of orientation relat...
Definition: Vector2D.h:37
Belle2::TrackFindingCDC::CDCAxialStereoFusion::reconstructFuseTrajectories
void reconstructFuseTrajectories(const CDCSegmentPair &segmentPair)
Combine the two trajectories of the segments in the pair and assign the resulting three dimensional t...
Definition: CDCAxialStereoFusion.cc:43
Belle2::TrackFindingCDC::SimpleSegmentPairFilter::operator()
Weight operator()(const CDCSegmentPair &segmentPair) final
Checks if a pair of segments is a good combination.
Definition: SimpleSegmentPairFilter.cc:24
Belle2::TrackFindingCDC::SimpleSegmentPairFilter::getFittedTrajectory2D
const CDCTrajectory2D & getFittedTrajectory2D(const CDCSegment2D &segment) const
Returns the trajectory of the segment. Also fits it if necessary.
Definition: SimpleSegmentPairFilter.cc:94
Belle2::TrackFindingCDC::CDCTrajectory2D
Particle trajectory as it is seen in xy projection represented as a circle.
Definition: CDCTrajectory2D.h:46
Belle2::TrackFindingCDC::CDCSegmentPair::getToSegment
const CDCSegment2D * getToSegment() const
Getter for the to segment.
Definition: CDCSegmentPair.h:132
Belle2::TrackFindingCDC::CDCFitter2D::update
void update(CDCTrajectory2D &trajectory2D, const CDCObservations2D &observations2D) const
Update the trajectory with a fit to the observations.
Definition: CDCFitter2D.icc.h:62
Belle2::TrackFindingCDC::SimpleSegmentPairFilter::getFittedTrajectory3D
const CDCTrajectory3D & getFittedTrajectory3D(const CDCSegmentPair &segmentPair) const
Returns the three dimensional trajectory of the axial stereo segment pair.
Definition: SimpleSegmentPairFilter.cc:103
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TrackFindingCDC::CDCTrajectory2D::getFlightDirection2D
Vector2D getFlightDirection2D(const Vector2D &point) const
Get the unit direction of flight at the given point, where arcLength2D = 0.
Definition: CDCTrajectory2D.h:320
Belle2::TrackFindingCDC::CDCAxialStereoFusion
Utility class implementing the Kalmanesk combination of to two dimensional trajectories to one three ...
Definition: CDCAxialStereoFusion.h:40
Belle2::TrackFindingCDC::CDCTrajectory2D::isFitted
bool isFitted() const
Checks if the circle is already set to a valid value.
Definition: CDCTrajectory2D.cc:85
Belle2::TrackFindingCDC::CDCTrajectory2D::getArcLength2DGap
double getArcLength2DGap(const AFromHits &fromHits, const AToHits &toHits) const
Calculates the perpendicular travel distance from the last position of the fromHits to the first posi...
Definition: CDCTrajectory2D.h:220
Belle2::TrackFindingCDC::CDCSegment2D
A reconstructed sequence of two dimensional hits in one super layer.
Definition: CDCSegment2D.h:40
Belle2::TrackFindingCDC::CDCSegmentPair::getTrajectory3D
CDCTrajectory3D & getTrajectory3D() const
Getter for the three dimensional trajectory.
Definition: CDCSegmentPair.h:213
Belle2::TrackFindingCDC::CDCTrajectory2D::getDist2D
double getDist2D(const Vector2D &point) const
Calculates the distance from the point to the trajectory as seen from the xy projection.
Definition: CDCTrajectory2D.h:419
Belle2::TrackFindingCDC::Vector2D::angleWith
double angleWith(const Vector2D &rhs) const
The angle between this and rhs.
Definition: Vector2D.h:211
Belle2::TrackFindingCDC::CDCSegmentPair::getFromSegment
const CDCSegment2D * getFromSegment() const
Getter for the from segment.
Definition: CDCSegmentPair.h:120
Belle2::TrackFindingCDC::CDCTrajectory2D::getArcLength2DBackOffset
double getArcLength2DBackOffset(const AFromHits &fromHits, const AToHits &toHits) const
Calculates the perpendicular travel distance from the last position of the fromHits to the last posit...
Definition: CDCTrajectory2D.h:244
Belle2::TrackFindingCDC::CDCTrajectory3D
Particle full three dimensional trajectory.
Definition: CDCTrajectory3D.h:47