Belle II Software  release-05-01-25
SVDSignal.cc
1 
2 
3 
4 #include <framework/dataobjects/RelationElement.h>
5 #include <svd/simulation/SVDSignal.h>
6 #include <gtest/gtest.h>
7 #include <iostream>
8 #include <sstream>
9 
10 using namespace std;
11 
12 namespace Belle2 {
17  namespace SVD {
18 
22  TEST(SVDSignal, Getters)
23  {
24  // First create an artificial signal and load it with data.
25  vector<double> charges;
26  charges.push_back(10);
27  charges.push_back(11);
28  charges.push_back(30);
29  vector<double> times;
30  for (int i = 0; i < 3; ++i) times.push_back(i * 15.0e-9);
31  vector<RelationElement::index_type> mcParticles;
32  for (int i = 0; i < 3; ++i) mcParticles.push_back(3 * i);
33  vector<RelationElement::index_type> trueHits;
34  for (int i = 0; i < 3; ++i) trueHits.push_back(7 * i);
35  const float tau = 25.0e-9;
36  SVDSignal signal;
37  for (int i = 0; i < 3; ++i) signal.add(times.at(i), charges.at(i), tau, mcParticles.at(i), trueHits.at(i));
38  // Test SVDSignal::getCharge()
39  double totalcharge = 0;
40  for (int i = 0; i < 3; ++i) totalcharge += charges.at(i);
41  EXPECT_EQ(signal.getCharge(), totalcharge);
42  //Test SVDSignal::getFunctions()
43  SVDSignal::function_list functions = signal.getFunctions();
44  for (int i = 0; i < 3; ++i) {
45  EXPECT_EQ(functions.at(i).m_initTime, times.at(i));
46  EXPECT_EQ(functions.at(i).m_charge, charges.at(i));
47  EXPECT_EQ(functions.at(i).m_tau, tau);
48  EXPECT_EQ(functions.at(i).m_particle, mcParticles.at(i));
49  EXPECT_EQ(functions.at(i).m_truehit, trueHits.at(i));
50  }
51  }
52 
54  TEST(SVDSignal, Constructors)
55  {
56  // Create an artificial signal and load it with data.
57  vector<double> charges;
58  charges.push_back(10);
59  charges.push_back(11);
60  charges.push_back(30);
61  vector<double> times;
62  for (int i = 0; i < 3; ++i) times.push_back(i * 15.0e-9);
63  vector<RelationElement::index_type> mcParticles;
64  for (int i = 0; i < 3; ++i) mcParticles.push_back(3 * i);
65  vector<RelationElement::index_type> trueHits;
66  for (int i = 0; i < 3; ++i) trueHits.push_back(7 * i);
67  const float tau = 25.0e-9;
68  SVDSignal signal;
69  for (int i = 0; i < 3; ++i) signal.add(times.at(i), charges.at(i), tau, mcParticles.at(i), trueHits.at(i));
70  // Test the copy constructor
71  SVDSignal signal2(signal);
72  double totalcharge = 0;
73  for (int i = 0; i < 3; ++i) totalcharge += charges.at(i);
74  EXPECT_EQ(signal2.getCharge(), totalcharge);
75  //Test SVDSignal::getFunctions()
76  SVDSignal::function_list functions = signal2.getFunctions();
77  size_t n = functions.size();
78  EXPECT_EQ(n, 3);
79  for (int i = 0; i < 3; ++i) {
80  EXPECT_EQ(functions.at(i).m_initTime, times.at(i));
81  EXPECT_EQ(functions.at(i).m_charge, charges.at(i));
82  EXPECT_EQ(functions.at(i).m_tau, tau);
83  EXPECT_EQ(functions.at(i).m_particle, mcParticles.at(i));
84  EXPECT_EQ(functions.at(i).m_truehit, trueHits.at(i));
85  }
86  }
87 
89  TEST(SVDSignal, Assignment)
90  {
91  // Create an artificial signal and load it with data.
92  vector<double> charges;
93  charges.push_back(10);
94  charges.push_back(11);
95  charges.push_back(30);
96  vector<double> times;
97  for (int i = 0; i < 3; ++i) times.push_back(i * 15.0e-9);
98  vector<RelationElement::index_type> mcParticles;
99  for (int i = 0; i < 3; ++i) mcParticles.push_back(3 * i);
100  vector<RelationElement::index_type> trueHits;
101  for (int i = 0; i < 3; ++i) trueHits.push_back(7 * i);
102  const float tau = 25.0e-9;
103  SVDSignal signal;
104  for (int i = 0; i < 3; ++i) signal.add(times.at(i), charges.at(i), tau, mcParticles.at(i), trueHits.at(i));
105  // Test the assignment operator
106  SVDSignal signal2 = signal;
107  double totalcharge = 0;
108  for (int i = 0; i < 3; ++i) totalcharge += charges.at(i);
109  EXPECT_EQ(signal2.getCharge(), totalcharge);
110  //Test SVDSignal::getFunctions()
111  SVDSignal::function_list functions = signal2.getFunctions();
112  for (int i = 0; i < 3; ++i) {
113  EXPECT_EQ(functions.at(i).m_initTime, times.at(i));
114  EXPECT_EQ(functions.at(i).m_charge, charges.at(i));
115  EXPECT_EQ(functions.at(i).m_tau, tau);
116  EXPECT_EQ(functions.at(i).m_particle, mcParticles.at(i));
117  EXPECT_EQ(functions.at(i).m_truehit, trueHits.at(i));
118  }
119  }
120 
122  TEST(SVDSignal, Waveform)
123  {
124  // Create an artificial signal and load it with data.
125  vector<double> charges;
126  charges.push_back(10);
127  charges.push_back(11);
128  charges.push_back(30);
129  vector<double> times;
130  for (int i = 0; i < 3; ++i) times.push_back(i * 15.0e-9);
131  vector<RelationElement::index_type> mcParticles;
132  for (int i = 0; i < 3; ++i) mcParticles.push_back(3 * i);
133  vector<RelationElement::index_type> trueHits;
134  for (int i = 0; i < 3; ++i) trueHits.push_back(7 * i);
135  const float tau = 25.0e-9; // 25 ns shaping time
136  SVDSignal signal;
137  for (int i = 0; i < 3; ++i) signal.add(times.at(i), charges.at(i), tau, mcParticles.at(i), trueHits.at(i));
138  // Test operator()
139  double time = 40.0e-9; // 40 ns
140  // expected function value
141  double expected_value = 0;
142  SVDSignal::relations_map expected_particles_map;
143  SVDSignal::relations_map expected_truehits_map;
144  int i = 0;
145  for (SVDSignal::Wave wave : signal.getFunctions()) {
146  double value = signal.waveform(time, wave);
147  expected_value += value;
148  expected_particles_map[mcParticles.at(i)] += wave.m_charge;
149  expected_truehits_map[trueHits.at(i)] += wave.m_charge;
150  i++;
151  }
152  double function_value = signal(time);
153  EXPECT_EQ(function_value, expected_value);
154  }
155 
157  TEST(SVDSignal, toString)
158  {
159  // Create an artificial signal and load it with data.
160  vector<double> charges;
161  charges.push_back(10);
162  charges.push_back(11);
163  charges.push_back(30);
164  vector<double> times;
165  for (int i = 0; i < 3; ++i) times.push_back(i * 15.0e-9);
166  vector<RelationElement::index_type> mcParticles;
167  for (int i = 0; i < 3; ++i) mcParticles.push_back(3 * i);
168  vector<RelationElement::index_type> trueHits;
169  for (int i = 0; i < 3; ++i) trueHits.push_back(7 * i);
170  const float tau = 50.0e-9; // 25 ns shaping time
171  SVDSignal signal;
172  for (int i = 0; i < 3; ++i) signal.add(times.at(i), charges.at(i), tau, mcParticles.at(i), trueHits.at(i));
173  std::ostringstream os;
174  for (int i = 0; i < 3; ++i)
175  os << i + 1 << '\t' << times.at(i) << '\t' << charges.at(i) << '\t' << tau << std::endl;
176  EXPECT_EQ(signal.toString(), os.str());
177  }
178 
179  } // namespace SVD
181 } // namespace Belle2
Belle2::SVD::SVDSignal::function_list
std::deque< Wave > function_list
List of elementary waveforms.
Definition: SVDSignal.h:89
Belle2::SVD::SVDSignal::getCharge
double getCharge() const
Return the charge collected in the strip.
Definition: SVDSignal.h:186
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TEST
TEST(TestgetDetectorRegion, TestgetDetectorRegion)
Test Constructors.
Definition: utilityFunctions.cc:18
Belle2::SVD::SVDSignal::Wave
Type to store elementary waveforms.
Definition: SVDSignal.h:62
Belle2::SVD::SVDSignal::relations_map
std::map< RelationElement::index_type, RelationElement::weight_type > relations_map
Type to store contributions to strip signal by different particles on output of SVDSignal.
Definition: SVDSignal.h:92
Belle2::SVD::SVDSignal::getFunctions
const function_list & getFunctions() const
Return the list of waveform parameters.
Definition: SVDSignal.h:191
Belle2::SVD::SVDSignal
The SVD signal class.
Definition: SVDSignal.h:52