Belle II Software  release-05-01-25
OffOriginExtension.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2015 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Viktor Trusov, Nils Braun, Dmitrii Neverov *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 #include <tracking/trackFindingCDC/legendre/quadtree/OffOriginExtension.h>
11 
12 #include <tracking/trackFindingCDC/legendre/quadtree/AxialHitQuadTreeProcessor.h>
13 #include <tracking/trackFindingCDC/processing/AxialTrackUtil.h>
14 
15 #include <tracking/trackFindingCDC/fitting/CDCKarimakiFitter.h>
16 #include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
17 
18 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory2D.h>
19 
20 #include <tracking/trackFindingCDC/numerics/LookupTable.h>
21 #include <tracking/trackFindingCDC/geometry/Vector2D.h>
22 
23 #include <vector>
24 
25 using namespace Belle2;
26 using namespace TrackFindingCDC;
27 
28 OffOriginExtension::OffOriginExtension(std::vector<const CDCWireHit*> allAxialWireHits,
29  double levelPrecision)
30  : BaseCandidateReceiver(std::move(allAxialWireHits))
31  , m_levelPrecision(levelPrecision)
32 {
33 }
34 
35 void OffOriginExtension::operator()(const std::vector<const CDCWireHit*>& inputWireHits,
36  void* qt __attribute__((unused)))
37 {
38  // Unset the taken flag and let the postprocessing decide
39  for (const CDCWireHit* wireHit : inputWireHits) {
40  (*wireHit)->setTakenFlag(false);
41  }
42 
43  std::vector<const CDCWireHit*> candidateHits = roadSearch(inputWireHits);
46  m_tracks,
47  true);
48 }
49 
50 std::vector<const CDCWireHit*>
51 OffOriginExtension::roadSearch(const std::vector<const CDCWireHit*>& wireHits)
52 {
54  CDCTrajectory2D trackTrajectory2D = fitter.fit(wireHits);
55 
56  double chi2 = trackTrajectory2D.getChi2();
57  Vector2D refPos = trackTrajectory2D.getGlobalPerigee();
58 
59  // change sign of the curvature; should be the same as the charge of the candidate
60  double curv = trackTrajectory2D.getCurvature();
61 
62  // theta is the vector normal to the trajectory at the perigee
63  double theta = trackTrajectory2D.getGlobalCircle().phi0() + M_PI_2;
64 
65  // Hide the current hits from the road search
66  for (const CDCWireHit* hit : wireHits) {
67  hit->getAutomatonCell().setTakenFlag(true);
68  }
69 
70  std::vector<const CDCWireHit*> newWireHits = getHitsWRTtoRefPos(refPos, curv, theta);
71 
72  // Unhide the current hits from the road search
73  for (const CDCWireHit* hit : wireHits) {
74  hit->getAutomatonCell().setTakenFlag(false);
75  }
76 
77  if (newWireHits.size() == 0) return wireHits;
78 
79  std::vector<const CDCWireHit*> combinedWireHits;
80 
81  for (const CDCWireHit* hit : wireHits) {
82  combinedWireHits.push_back(hit);
83  }
84 
85  for (const CDCWireHit* hit : newWireHits) {
86  combinedWireHits.push_back(hit);
87  }
88 
89  CDCTrajectory2D combinedTrajectory2D = fitter.fit(wireHits);
90  double combinedChi2 = combinedTrajectory2D.getChi2();
91 
92  if (combinedChi2 < chi2 * 2.) {
93  return combinedWireHits;
94  }
95 
96  return wireHits;
97 }
98 
99 std::vector<const CDCWireHit*>
100 OffOriginExtension::getHitsWRTtoRefPos(const Vector2D& refPos, float curv, float theta)
101 {
102  float thetaPrecision = 3.1415 / (pow(2., m_levelPrecision + 1));
103  float curvPrecision = 0.15 / (pow(2., m_levelPrecision));
104 
105  using YSpan = AxialHitQuadTreeProcessor::YSpan;
106  YSpan curvSpan{curv - curvPrecision, curv + curvPrecision};
107  LookupTable<Vector2D> thetaSpan(&Vector2D::Phi, 1, theta - thetaPrecision, theta + thetaPrecision);
108 
109  AxialHitQuadTreeProcessor qtProcessor(refPos, curvSpan, &thetaSpan);
110  qtProcessor.seed(m_allAxialWireHits);
111 
112  std::vector<const CDCWireHit*> newWireHits = qtProcessor.getAssignedItems();
113  return newWireHits;
114 }
Belle2::TrackFindingCDC::CDCTrajectory2D::getGlobalPerigee
Vector2D getGlobalPerigee() const
Getter for the closest approach on the trajectory to the global origin.
Definition: CDCTrajectory2D.h:351
Belle2::TrackFindingCDC::OffOriginExtension::OffOriginExtension
OffOriginExtension(std::vector< const CDCWireHit * > allAxialWireHits, double levelPrecision=9)
Constructor.
Definition: OffOriginExtension.cc:28
Belle2::TrackFindingCDC::BaseCandidateReceiver
Base class that receives candidates found by quadtree.
Definition: BaseCandidateReceiver.h:35
Belle2::TrackFindingCDC::Vector2D
A two dimensional vector which is equipped with functions for correct handeling of orientation relat...
Definition: Vector2D.h:37
Belle2::TrackFindingCDC::AxialHitQuadTreeProcessor
A QuadTreeProcessor for TrackHits.
Definition: AxialHitQuadTreeProcessor.h:38
Belle2::TrackFindingCDC::QuadTreeProcessor::seed
void seed(std::vector< AData * > &datas)
Fill in the items in the given vector.
Definition: QuadTreeProcessor.h:112
Belle2::TrackFindingCDC::LookupTable
Class which holds precomputed values of a function.
Definition: LookupTable.h:60
Belle2::TrackFindingCDC::BaseCandidateReceiver::m_tracks
std::vector< CDCTrack > m_tracks
Collected tracks.
Definition: BaseCandidateReceiver.h:52
Belle2::TrackFindingCDC::CDCKarimakiFitter
Class implementing the fitter using Karimakis method.
Definition: CDCKarimakiFitter.h:33
Belle2::TrackFindingCDC::CDCTrajectory2D::getCurvature
double getCurvature() const
Getter for the curvature as seen from the xy projection.
Definition: CDCTrajectory2D.h:432
Belle2::TrackFindingCDC::OffOriginExtension::operator()
void operator()(const std::vector< const CDCWireHit * > &inputWireHits, void *qt) final
Main entry point for the post processing call from the QuadTreeProcessor.
Definition: OffOriginExtension.cc:35
Belle2::TrackFindingCDC::CDCTrajectory2D::getChi2
double getChi2() const
Getter for the chi2 value of the circle fit.
Definition: CDCTrajectory2D.h:478
Belle2::TrackFindingCDC::CDCTrajectory2D
Particle trajectory as it is seen in xy projection represented as a circle.
Definition: CDCTrajectory2D.h:46
Belle2::TrackFindingCDC::Vector2D::Phi
static Vector2D Phi(const double phi)
Constucts a unit vector with azimuth angle equal to phi.
Definition: Vector2D.h:73
Belle2::TrackFindingCDC::OffOriginExtension::roadSearch
std::vector< const CDCWireHit * > roadSearch(const std::vector< const CDCWireHit * > &wireHits)
Perform transformation for set of given hits; reference position taken as POCA of the fitted trajecto...
Definition: OffOriginExtension.cc:51
Belle2::TrackFindingCDC::AxialTrackUtil::addCandidateFromHits
static void addCandidateFromHits(const std::vector< const CDCWireHit * > &foundAxialWireHits, const std::vector< const CDCWireHit * > &allAxialWireHits, std::vector< CDCTrack > &axialTracks, bool withPostprocessing=true)
Create CDCTrack using CDCWireHit hits and store it in the list. Then call the postprocessing on it.
Definition: AxialTrackUtil.cc:26
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TrackFindingCDC::BaseCandidateReceiver::m_allAxialWireHits
std::vector< const CDCWireHit * > m_allAxialWireHits
Pool of all axial hits from which the road search may select additional hits.
Definition: BaseCandidateReceiver.h:49
Belle2::TrackFindingCDC::OffOriginExtension::getHitsWRTtoRefPos
std::vector< const CDCWireHit * > getHitsWRTtoRefPos(const Vector2D &refPos, float curv, float theta)
Get hits which are compatible with given trajectory.
Definition: OffOriginExtension.cc:100
Belle2::TrackFindingCDC::PerigeeCircle::phi0
double phi0() const
Getter for the azimuth angle of the direction of flight at the perigee.
Definition: PerigeeCircle.h:432
Belle2::TrackFindingCDC::QuadTreeProcessor::getAssignedItems
std::vector< AData * > getAssignedItems()
Get items that have been assigned to the seed level The returned elements are unique even if items ar...
Definition: QuadTreeProcessor.h:158
Belle2::TrackFindingCDC::CDCKarimakiFitter::getNoDriftVarianceFitter
static const CDCKarimakiFitter & getNoDriftVarianceFitter()
Static getter for a general fitter that does not use the drift length variances.
Definition: CDCKarimakiFitter.cc:35
Belle2::TrackFindingCDC::CDCWireHit
Class representing a hit wire in the central drift chamber.
Definition: CDCWireHit.h:65
Belle2::TrackFindingCDC::QuadTreeProcessor< long, float, const CDCWireHit >::YSpan
typename QuadTree::YSpan YSpan
This pair describes the span in Y for a node.
Definition: QuadTreeProcessor.h:60
Belle2::TrackFindingCDC::CDCTrajectory2D::getGlobalCircle
PerigeeCircle getGlobalCircle() const
Getter for the circle in global coordinates.
Definition: CDCTrajectory2D.h:451
Belle2::TrackFindingCDC::OffOriginExtension::m_levelPrecision
double m_levelPrecision
Precision level for the width of the off origin hough search.
Definition: OffOriginExtension.h:60