Belle II Software  release-05-01-25
BasicTrackVarSet.test.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2018 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Michael Eliachevitch <michael.eliachevitch@kit.edu> *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 #include <gtest/gtest.h>
11 #include <framework/utilities/TestHelpers.h>
12 #include <tracking/trackFindingCDC/testFixtures/TrackFindingCDCTestWithTopology.h>
13 
14 #include <tracking/trackFindingCDC/filters/track/BasicTrackVarSet.h>
15 #include <tracking/trackFindingCDC/eventdata/tracks/CDCTrack.h>
16 
17 #include <cdc/dataobjects/CDCHit.h>
18 #include <cdc/dataobjects/WireID.h>
19 #include <tracking/trackFindingCDC/eventdata/hits/CDCRLWireHit.h>
20 #include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
21 #include <tracking/trackFindingCDC/topology/CDCWireTopology.h>
22 #include <tracking/trackFindingCDC/geometry/Vector3D.h>
23 
24 #include <vector>
25 
26 using namespace Belle2;
27 using namespace TrackFindingCDC;
28 
29 TEST(BasicTrackVarSetCalculation, test_empty_track)
30 {
31  // Define mean variables to be 0 for empty track. Default of boost accumulator library is NAN, but
32  // that the BDT cannot train on. Should be converted to 0 via the toFinite function.
33 
34  // create an empty track containing no hits
35  const CDCTrack emptyTrack;
36  // extract variables from emtpy track
37  BasicTrackVarSet trackVarSet;
38 
39  // returnvalue should be false
40  bool returnvalue = trackVarSet.extract(&emptyTrack);
41  EXPECT_EQ(false, returnvalue);
42 
43  // for empty tracks the extraction calculations are not performed
44  // thus all variables should be 0
45  EXPECT_EQ(0, *trackVarSet.find("size"));
46  EXPECT_EQ(0, *trackVarSet.find("pt"));
47 
48  EXPECT_EQ(0, *trackVarSet.find("drift_length_mean"));
49  EXPECT_EQ(0, *trackVarSet.find("drift_length_sum"));
50  EXPECT_EQ(0, *trackVarSet.find("drift_length_min"));
51  EXPECT_EQ(0, *trackVarSet.find("drift_length_max"));
52  EXPECT_EQ(0, *trackVarSet.find("drift_length_variance"));
53 
54  EXPECT_EQ(0, *trackVarSet.find("adc_mean"));
55  EXPECT_EQ(0, *trackVarSet.find("adc_sum"));
56  EXPECT_EQ(0, *trackVarSet.find("adc_min"));
57  EXPECT_EQ(0, *trackVarSet.find("adc_max"));
58  EXPECT_EQ(0, *trackVarSet.find("adc_variance"));
59 
60  EXPECT_EQ(0, *trackVarSet.find("empty_s_mean"));
61  EXPECT_EQ(0, *trackVarSet.find("empty_s_sum"));
62  EXPECT_EQ(0, *trackVarSet.find("empty_s_min"));
63  EXPECT_EQ(0, *trackVarSet.find("empty_s_max"));
64  EXPECT_EQ(0, *trackVarSet.find("empty_s_variance"));
65  EXPECT_EQ(0, *trackVarSet.find("s_range"));
66 }
67 
68 TEST_F(TrackFindingCDCTestWithTopology, basicTrackVarSet_test_one_hit_track)
69 {
70  // create a dummy track with only one hit
71  const CDCWireTopology& wireTopology = CDCWireTopology::getInstance();
72 
73  const WireID& aWireID = wireTopology.getWire(0, 0, 0).getWireID();
74  double driftLength = 2.0;
75  unsigned short adcCount = 512.0;
76  double arcLength2D = 0.3;
77  const CDCHit aHit(128, adcCount, aWireID);
78  const CDCWireHit aWireHit(&aHit, driftLength);
79  const CDCRLWireHit aRLWireHit(&aWireHit, ERightLeft::c_Unknown);
80  double some_arbitrary_z_coord = 0.0;
81  const Vector3D aRecoPos(aRLWireHit.getRefPos2D(), some_arbitrary_z_coord);
82  const CDCRecoHit3D aCDCHit(aRLWireHit, aRecoPos, arcLength2D);
83  const std::vector<CDCRecoHit3D> aHitVector{aCDCHit};
84  const CDCTrack track(aHitVector);
85 
86  // extrack variables from track
87  BasicTrackVarSet trackVarSet;
88 
89  trackVarSet.extract(&track);
90 
91  EXPECT_EQ(1, *trackVarSet.find("size"));
92 
93  EXPECT_EQ(driftLength, *trackVarSet.find("drift_length_mean"));
94  EXPECT_EQ(driftLength, *trackVarSet.find("drift_length_sum"));
95  EXPECT_EQ(driftLength, *trackVarSet.find("drift_length_min"));
96  EXPECT_EQ(driftLength, *trackVarSet.find("drift_length_max"));
97  // variance not calculatable, define it to be -1
98  EXPECT_EQ(-1, *trackVarSet.find("drift_length_variance"));
99 
100  EXPECT_EQ(adcCount, *trackVarSet.find("adc_mean"));
101  EXPECT_EQ(adcCount, *trackVarSet.find("adc_sum"));
102  EXPECT_EQ(adcCount, *trackVarSet.find("adc_min"));
103  EXPECT_EQ(adcCount, *trackVarSet.find("adc_max"));
104  // variance not calculatable, define it to be -1
105  EXPECT_EQ(-1, *trackVarSet.find("adc_variance"));
106 
107  // with only one arc length (s), there are no gaps in s, thus empty_s variables empty
108  EXPECT_EQ(0, *trackVarSet.find("empty_s_mean"));
109  EXPECT_EQ(0, *trackVarSet.find("empty_s_sum"));
110  EXPECT_EQ(0, *trackVarSet.find("empty_s_min"));
111  EXPECT_EQ(0, *trackVarSet.find("empty_s_max"));
112  EXPECT_EQ(0, *trackVarSet.find("s_range"));
113  // variance not calculatable, define it to be -1
114  EXPECT_EQ(-1, *trackVarSet.find("empty_s_variance"));
115 }
116 
117 TEST_F(TrackFindingCDCTestWithTopology, basicTrackVarSet_test_two_hit_track)
118 {
119 
120  // create a dummy track with only one hit
121  const CDCWireTopology& wireTopology = CDCWireTopology::getInstance();
122 
123  const WireID& aWireID = wireTopology.getWire(0, 0, 0).getWireID();
124  const WireID& bWireID = wireTopology.getWire(0, 0, 1).getWireID();
125  std::vector<WireID> wireIDs = {aWireID, bWireID};
126 
127  std::vector<double> drift_lengths = {2.0, 3.0};
128  // large ADC counts might cause errors in calculation due to short data type
129  // for example when squaring to get the variance
130  std::vector<unsigned short> adc_counts = {30, 500};
131  std::vector<double> arc_length_2Ds = {2.0, -3.0};
132 
133  std::vector<CDCHit> cdcHits;
134  std::vector<CDCWireHit> cdcWireHits;
135  std::vector<CDCRecoHit3D> cdcRecoHits;
136 
137  for (size_t i = 0; i < drift_lengths.size(); i++) {
138  cdcHits.emplace_back(128, adc_counts.at(i), wireIDs.at(i)); // store in vector to avoid nullptrs
139  cdcWireHits.emplace_back(&cdcHits.at(i), drift_lengths.at(i));
140  CDCRLWireHit aRLWireHit(&cdcWireHits.at(i), ERightLeft::c_Unknown);
141  Vector3D aRecoPos(aRLWireHit.getRefPos2D(), 0.0);
142  cdcRecoHits.emplace_back(aRLWireHit, aRecoPos, arc_length_2Ds.at(i));
143  }
144 
145  const CDCTrack track(cdcRecoHits);
146 
147  // extrack variables from track
148  BasicTrackVarSet trackVarSet;
149  trackVarSet.extract(&track);
150 
151  EXPECT_EQ(2, *trackVarSet.find("size"));
152 
153  EXPECT_EQ(2.5, *trackVarSet.find("drift_length_mean"));
154  EXPECT_EQ(5.0, *trackVarSet.find("drift_length_sum"));
155  EXPECT_EQ(2.0, *trackVarSet.find("drift_length_min"));
156  EXPECT_EQ(3.0, *trackVarSet.find("drift_length_max"));
157  // variance from python: np.sqrt(np.var([2, 3])*2/(2-1))
158  EXPECT_NEAR(0.7071, *trackVarSet.find("drift_length_variance"), 1e-4);
159 
160  EXPECT_EQ(265, *trackVarSet.find("adc_mean"));
161  EXPECT_EQ(530, *trackVarSet.find("adc_sum"));
162  EXPECT_EQ(30, *trackVarSet.find("adc_min"));
163  EXPECT_EQ(500, *trackVarSet.find("adc_max"));
164  EXPECT_NEAR(332.34, *trackVarSet.find("adc_variance"), 1e-2);
165 
166  // for empty_s, there is only one hit gap with two hits
167  double only_empty_s = -5.0;
168  EXPECT_EQ(only_empty_s, *trackVarSet.find("empty_s_mean"));
169  EXPECT_EQ(only_empty_s, *trackVarSet.find("empty_s_sum"));
170  EXPECT_EQ(only_empty_s, *trackVarSet.find("empty_s_min"));
171  EXPECT_EQ(only_empty_s, *trackVarSet.find("empty_s_max"));
172  EXPECT_EQ(only_empty_s, *trackVarSet.find("s_range"));
173  // variance not calculatable
174  EXPECT_EQ(-1, *trackVarSet.find("empty_s_variance"));
175 }
176 
177 TEST_F(TrackFindingCDCTestWithTopology, basicTrackVarSet_test_empty_s_for_three_hit_track)
178 {
179  // Just test the empty_s calculations also with three hits, which result in two empty_s values
180  const CDCWireTopology& wireTopology = CDCWireTopology::getInstance();
181 
182  const WireID& aWireID = wireTopology.getWire(0, 0, 0).getWireID();
183  const WireID& bWireID = wireTopology.getWire(0, 0, 1).getWireID();
184  const WireID& cWireID = wireTopology.getWire(0, 0, 2).getWireID();
185  std::vector<WireID> wireIDs = {aWireID, bWireID, cWireID};
186 
187  // -> empty_s hit gaps = {2, 3}
188  std::vector<double> arc_length_2Ds = { -2.0, 0.0, 3.0};
189 
190  std::vector<CDCHit> cdcHits;
191  cdcHits.reserve(wireIDs.size());
192  std::vector<CDCWireHit> cdcWireHits;
193  cdcWireHits.reserve(wireIDs.size());
194  std::vector<CDCRecoHit3D> cdcRecoHits;
195  cdcRecoHits.reserve(wireIDs.size());
196 
197  for (const WireID& wireID : wireIDs) {
198  cdcHits.emplace_back(128, 0, wireID);
199  }
200  for (const CDCHit& cdcHit : cdcHits) {
201  cdcWireHits.emplace_back(&cdcHit, 0);
202  }
203  for (std::size_t i = 0; i < cdcWireHits.size(); i++) {
204  const CDCRLWireHit aRLWireHit(&cdcWireHits.at(i), ERightLeft::c_Unknown);
205  const Vector3D aRecoPos(aRLWireHit.getRefPos2D(), 0.0);
206  cdcRecoHits.emplace_back(aRLWireHit, aRecoPos, arc_length_2Ds.at(i));
207  }
208 
209  const CDCTrack track(cdcRecoHits);
210 
211  // extrack variables from track
212  BasicTrackVarSet trackVarSet;
213  trackVarSet.extract(&track);
214 
215  EXPECT_EQ(3, *trackVarSet.find("size"));
216 
217  EXPECT_EQ(2.5, *trackVarSet.find("empty_s_mean"));
218  EXPECT_EQ(5.0, *trackVarSet.find("empty_s_sum"));
219  EXPECT_EQ(2.0, *trackVarSet.find("empty_s_min"));
220  EXPECT_EQ(3.0, *trackVarSet.find("empty_s_max"));
221  EXPECT_NEAR(0.7071, *trackVarSet.find("empty_s_variance"), 1e-4);
222 }
Belle2::WireID
Class to identify a wire inside the CDC.
Definition: WireID.h:44
Belle2::Vector3D
HepGeom::Vector3D< double > Vector3D
3D Vector
Definition: Cell.h:35
Belle2::CDCHit
Class containing the result of the unpacker in raw data and the result of the digitizer in simulation...
Definition: CDCHit.h:51
Belle2::TrackFindingCDC::CDCWireTopology::getInstance
static CDCWireTopology & getInstance()
Getter for the singleton instance of the wire topology.
Definition: CDCWireTopology.cc:22
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TEST_F
TEST_F(GlobalLabelTest, LargeNumberOfTimeDependentParameters)
Test large number of time-dep params for registration and retrieval.
Definition: globalLabel.cc:65
Belle2::TEST
TEST(TestgetDetectorRegion, TestgetDetectorRegion)
Test Constructors.
Definition: utilityFunctions.cc:18
Belle2::TrackFindingCDC::CDCWireHit
Class representing a hit wire in the central drift chamber.
Definition: CDCWireHit.h:65