Belle II Software  release-08-01-10
Phi0Impact.test.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/testFixtures/TrackFindingCDCTestWithSimpleSimulation.h>
9 
10 #include <tracking/trackFindingCDC/hough/perigee/SimpleRLTaggedWireHitHoughTree.h>
11 #include <tracking/trackFindingCDC/hough/perigee/SimpleSegmentHoughTree.h>
12 #include <tracking/trackFindingCDC/hough/perigee/StandardBinSpec.h>
13 
14 #include <tracking/trackFindingCDC/hough/algorithms/InPhi0ImpactBox.h>
15 
16 #include <vector>
17 
18 using namespace Belle2;
19 using namespace TrackFindingCDC;
20 using namespace PerigeeBinSpec;
21 
22 namespace {
23 
24  TEST_F(TrackFindingCDCTestWithSimpleSimulation, hough_perigee_SimpleHitBasedHough_phi0_impact_onHits)
25  {
26  std::string svgFileName = "phi0_impact_on_hits.svg";
27 
28  Helix lowerHelix(0.00, 2.52033, -20, 0, 0);
29  Helix higherHelix(0.00, 3.0718, 20, 0, 0);
30 
31  simulate({lowerHelix, higherHelix});
32  saveDisplay(svgFileName);
33 
36 
37  SimpleRLTaggedWireHitHoughTree houghTree(maxLevel);
39 
40  houghTree.assignArray<DiscretePhi0>(phi0BinsSpec.constructArray(), phi0BinsSpec.getNOverlap());
41  //houghTree.assignArray<DiscreteImpact>(impactBinsSpec.constructArray(), impactBinsSpec.getNOverlap()); // Discrete
42  houghTree.assignArray<ContinuousImpact>({{minImpact, maxImpact}}, impactBinsSpec.getOverlap()); // Continuous
43  houghTree.initialize();
44 
45  // Execute the finding a couple of time to find a stable execution time.
46  std::vector< std::pair<HoughBox, std::vector<CDCRLWireHit> > > candidates;
47 
48  // Is this still C++? Looks like JavaScript to me :-).
49  TimeItResult timeItResult = timeIt(100, true, [&]() {
50  houghTree.fell();
51  houghTree.seed(m_axialWireHits);
52 
53  const double minWeight = 30.0;
54  candidates = houghTree.find(minWeight);
55  // candidates = houghTree.findBest(minWeight);
56 
57  ASSERT_EQ(m_mcTracks.size(), candidates.size());
58  // Check for the parameters of the track candidates
59  // The actual hit numbers are more than 30, but this is somewhat a lower bound
60  for (size_t iCand = 0; iCand < candidates.size(); ++iCand) {
61  EXPECT_GE(candidates[iCand].second.size(), 30);
62  }
63  });
64 
65  std::size_t nNodes = houghTree.getTree()->getNNodes();
66  B2INFO("Tree generated " << nNodes << " nodes");
67  houghTree.fell();
68  houghTree.raze();
69 
70 
71  size_t iColor = 0;
72  for (std::pair<HoughBox, std::vector<CDCRLWireHit> >& candidate : candidates) {
73  const HoughBox& houghBox = candidate.first;
74  const std::vector<CDCRLWireHit>& taggedHits = candidate.second;
75 
76  B2DEBUG(100, "Candidate");
77  B2DEBUG(100, "size " << taggedHits.size());
78  B2DEBUG(100, "Phi0 " << houghBox.getLowerBound<DiscretePhi0>()->phi());
79  B2DEBUG(100, "Impact " << houghBox.getLowerBound<ContinuousImpact>());
80 
81  B2DEBUG(100, "Tags of the hits");
82  for (const CDCRLWireHit& rlTaggedWireHit : taggedHits) {
83  B2DEBUG(100, " " <<
84  "rl = " << static_cast<int>(rlTaggedWireHit.getRLInfo()) << " " <<
85  "dl = " << rlTaggedWireHit.getRefDriftLength());
86  }
87 
88  for (const CDCRLWireHit& rlTaggedWireHit : taggedHits) {
89  const CDCWireHit& wireHit = rlTaggedWireHit.getWireHit();
90  std::string color = "blue";
91  if (rlTaggedWireHit.getRLInfo() == ERightLeft::c_Right) {
92  color = "green";
93  } else if (rlTaggedWireHit.getRLInfo() == ERightLeft::c_Left) {
94  color = "red";
95  }
96  //EventDataPlotter::AttributeMap strokeAttr {{"stroke", color}};
97  EventDataPlotter::AttributeMap strokeAttr {{"stroke", m_colors[iColor % m_colors.size()] }};
98  draw(wireHit, strokeAttr);
99  }
100  ++iColor;
101  }
102  saveDisplay(svgFileName);
103 
104  timeItResult.printSummary();
105  }
106 }
107 
108 
109 namespace {
110  TEST_F(TrackFindingCDCTestWithSimpleSimulation, hough_perigee_SimpleHitBasedHough_phi0_impact_onSegment)
111  {
112  std::string svgFileName = "phi0_impact_on_segments.svg";
113 
114  Helix lowerHelix(0.00, 2.52033, -20, 0, 0);
115  Helix higherHelix(0.00, 3.0718, 20, 0, 0);
116 
117  simulate({lowerHelix, higherHelix});
118  saveDisplay(svgFileName);
119 
120  using SimpleSegmentPhi0ImpactHoughTree =
122  SimpleSegmentPhi0ImpactHoughTree houghTree(maxLevel);
123 
124  using HoughBox = SimpleSegmentPhi0ImpactHoughTree::HoughBox;
125 
126  B2INFO("yes");
127  houghTree.assignArray<DiscretePhi0>(phi0BinsSpec.constructArray(), phi0BinsSpec.getNOverlap());
128  //houghTree.assignArray<DiscreteImpact>(impactBinsSpec.constructArray(), impactBinsSpec.getNOverlap()); // Discrete
129  houghTree.assignArray<ContinuousImpact>({{minImpact, maxImpact}}, impactBinsSpec.getOverlap()); // Continuous
130  houghTree.initialize();
131 
132  // Execute the finding a couple of time to find a stable execution time.
133  std::vector< std::pair<HoughBox, std::vector<const CDCSegment2D*> > > candidates;
134 
135  // Is this still C++? Looks like JavaScript to me :-).
136  TimeItResult timeItResult = timeIt(100, true, [&]() {
137  // Exclude the timing of the resource release for comparision with the legendre test.
138  houghTree.fell();
139 
140  houghTree.seed(m_mcAxialSegment2Ds);
141 
142  const double minWeight = 40.0;
143  candidates = houghTree.find(minWeight);
144  // candidates = houghTree.findBest(minWeight);
145 
146  ASSERT_EQ(m_mcTracks.size(), candidates.size());
147 
148  // Check for the parameters of the track candidates
149  // The actual hit numbers are more than 4 segment, but this is somewhat a lower bound
150  for (size_t iCand = 0; iCand < candidates.size(); ++iCand) {
151  EXPECT_GE(candidates[iCand].second.size(), 4);
152  }
153  });
154 
156  std::size_t nNodes = houghTree.getTree()->getNNodes();
157  B2INFO("Tree generated " << nNodes << " nodes");
158  houghTree.fell();
159  houghTree.raze();
160 
161  size_t iColor = 0;
162  for (std::pair<HoughBox, std::vector<const CDCSegment2D*> >& candidate : candidates) {
163  const HoughBox& houghBox = candidate.first;
164  const std::vector<const CDCSegment2D*>& segments = candidate.second;
165 
166  B2DEBUG(100, "Candidate");
167  B2DEBUG(100, "size " << segments.size());
168  B2DEBUG(100, "Phi0 " << houghBox.getLowerBound<DiscretePhi0>()->phi());
169  B2DEBUG(100, "Impact " << houghBox.getLowerBound<ContinuousImpact>());
170 
171  for (const CDCSegment2D* segment2D : segments) {
172  EventDataPlotter::AttributeMap strokeAttr {{"stroke", m_colors[iColor % m_colors.size()] }};
173  draw(*segment2D, strokeAttr);
174  }
175  ++iColor;
176  }
177  saveDisplay(svgFileName);
178  timeItResult.printSummary();
179  }
180 }
Helix parameter class.
Definition: Helix.h:48
Class representing an oriented hit wire including a hypotheses whether the causing track passes left ...
Definition: CDCRLWireHit.h:41
A reconstructed sequence of two dimensional hits in one super layer.
Definition: CDCSegment2D.h:39
Class representing a hit wire in the central drift chamber.
Definition: CDCWireHit.h:55
Type to have values not based on discrete positions from an array.
Representation for a discrete position in an array of discrete positions.
Definition: DiscreteValue.h:23
PrimitivePlotter::AttributeMap AttributeMap
Forward the Attributre map from the primitive plotter.
double getOverlap() const
Getter for the overlap in real impact to investigate the value that results from the discrete overlap...
Definition: ImpactRep.cc:45
DiscretePhi0::Array constructArray() const
Constuct the array of discrete phi0 positions.
Definition: Phi0Rep.cc:23
int getNOverlap() const
Getter for the overlap in discrete number of positions.
Definition: Phi0Rep.h:47
A convenience class based on a BoxDivisionHoughTree for "hit-like" classes.
typename InBox::HoughBox HoughBox
Type of the hough box.
Class to capture the time a repeated execution took.
Definition: TimeIt.h:29
void printSummary() const
Print a summary of the collected time to the console.
Definition: TimeIt.h:57
TEST_F(GlobalLabelTest, LargeNumberOfTimeDependentParameters)
Test large number of time-dep params for registration and retrieval.
Definition: globalLabel.cc:72
Abstract base class for different kinds of events.