Belle II Software development
SimpleSegmentTripleFilter.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/filters/segmentTriple/SimpleSegmentTripleFilter.h>
9
10#include <tracking/trackingUtilities/eventdata/tracks/CDCSegmentTriple.h>
11#include <tracking/trackingUtilities/eventdata/segments/CDCSegment3D.h>
12#include <tracking/trackingUtilities/eventdata/segments/CDCSegment2D.h>
13
14#include <tracking/trackingUtilities/eventdata/trajectories/CDCTrajectorySZ.h>
15
16#include <cdc/topology/CDCWire.h>
17
18#include <framework/logging/Logger.h>
19
20#include <Math/Vector3D.h>
21
22using namespace Belle2;
23using namespace CDC;
24using namespace TrackFindingCDC;
25using namespace TrackingUtilities;
26
28{
29 const CDCAxialSegment2D* ptrStartSegment = segmentTriple.getStartSegment();
30 const CDCStereoSegment2D* ptrMiddleSegment = segmentTriple.getMiddleSegment();
31 const CDCAxialSegment2D* ptrEndSegment = segmentTriple.getEndSegment();
32
33 assert(ptrStartSegment);
34 assert(ptrMiddleSegment);
35 assert(ptrEndSegment);
36
37 const CDCAxialSegment2D& startSegment = *ptrStartSegment;
38 const CDCStereoSegment2D& middleSegment = *ptrMiddleSegment;
39 const CDCAxialSegment2D& endSegment = *ptrEndSegment;
40
41 const double toleranceFraction = 0.0;
42
43 // Check if the middle segment lies within the acceptable bounds in angular deviation
44 {
45 //get the remembered fits
46 const CDCTrajectory2D& startFit = startSegment.getTrajectory2D();
47 const CDCTrajectory2D& endFit = endSegment.getTrajectory2D();
48
49 //use only the first and last hit for this check
50 const CDCRecoHit2D& firstHit = middleSegment.front();
51 const CDCRecoHit2D& lastHit = middleSegment.back();
52
53 ROOT::Math::XYZVector firstRecoPos = firstHit.reconstruct3D(startFit);
54 ROOT::Math::XYZVector lastRecoPos = lastHit.reconstruct3D(endFit);
55
56 const CDCWire& firstWire = firstHit.getWire();
57 const CDCWire& lastWire = lastHit.getWire();
58
59 const bool agrees =
60 firstWire.isInCellZBounds(firstRecoPos, toleranceFraction) and
61 lastWire.isInCellZBounds(lastRecoPos, toleranceFraction);
62
63 if (not agrees) return NAN;
64 }
65
66 // make more complex judgement on fitness
67
68 // Get the combined fit of start and end axial segment
69 CDCTrajectory2D trajectory2D = getFitter2D().fit(*(segmentTriple.getStartSegment()),
70 *(segmentTriple.getEndSegment()));
71
72 // Check if the middle segment is actually coaligned with the trajectory
73 EForwardBackward fbInfo = trajectory2D.isForwardOrBackwardTo(middleSegment);
74 if (fbInfo != EForwardBackward::c_Forward) return NAN;
75
76 // Reconstruct the middle stereo segment
77 CDCSegment3D reconstructedMiddle;
78 for (const CDCRecoHit2D& recoHit2D : middleSegment) {
79 reconstructedMiddle.push_back(CDCRecoHit3D::reconstruct(recoHit2D, trajectory2D));
80 if (not reconstructedMiddle.back().isInCellZBounds(toleranceFraction)) {
81 B2DEBUG(25, " RecoHit out of CDC");
82 return NAN;
83 }
84 }
85
86 // Fit the sz slope and intercept
87 CDCTrajectorySZ trajectorySZ;
88 getSZFitter().update(trajectorySZ, middleSegment, trajectory2D);
89 segmentTriple.setTrajectory3D(CDCTrajectory3D(trajectory2D, trajectorySZ));
90
91 Weight result = startSegment.size() + middleSegment.size() + endSegment.size();
92
93 return result;
94}
Class representing a sense wire in the central drift chamber.
Definition CDCWire.h:50
bool isInCellZBounds(const ROOT::Math::XYZVector &pos3D, const double factor=1) const
Checks whether the position is in the z bounds of the drift cell (scaled by the factor) surrounding t...
Definition CDCWire.h:287
TrackingUtilities::CDCTrajectory2D fit(const CDCObservations2D &observations2D) const
Fits a collection of observation drift circles.
void update(const TrackingUtilities::CDCSegmentPair &segmentPair) const
Updates the trajectory of the axial stereo segment pair inplace.
const CDCSZFitter & getSZFitter() const
Returns the sz fitter instance that is used by this filter.
const CDCRiemannFitter & getFitter2D() const
Returns the xy fitter instance that is used by this filter.
TrackingUtilities::Weight operator()(const TrackingUtilities::CDCSegmentTriple &segmentTriple) final
Checks if a triple of axial, stereo and axial segments is a good combination to be stored.
Class representing a two dimensional reconstructed hit in the central drift chamber.
const CDC::CDCWire & getWire() const
Getter for the wire the reconstructed hit associated to.
ROOT::Math::XYZVector reconstruct3D(const CDCTrajectory2D &trajectory2D, const double z=0) const
Reconstruct the three dimensional position (especially of stereo hits) by determining the z coordinat...
static CDCRecoHit3D reconstruct(const CDCRecoHit2D &recoHit2D, const CDCTrajectory2D &trajectory2D)
Reconstructs the three dimensional hit from the two dimensional and the two dimensional trajectory.
A segment consisting of three dimensional reconstructed hits.
Class representing a triple of reconstructed segments in adjacent superlayer.
const CDCStereoSegment2D * getMiddleSegment() const
Getter for the middle stereo segment.
const CDCAxialSegment2D * getEndSegment() const
Getter for the end axial segment.
void setTrajectory3D(const CDCTrajectory3D &trajectory3D) const
Setter for the three dimensional helix trajectory.
const CDCAxialSegment2D * getStartSegment() const
Getter for the start axial segment.
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.
Abstract base class for different kinds of events.