Belle II Software  release-08-01-10
TrackFindingCDCTestWithSimpleSimulation.h
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 #pragma once
9 
10 #include <tracking/trackFindingCDC/display/EventDataPlotter.h>
11 #include <tracking/trackFindingCDC/sim/CDCSimpleSimulation.h>
12 
13 #include <tracking/trackFindingCDC/eventdata/tracks/CDCTrack.h>
14 #include <tracking/trackFindingCDC/eventdata/segments/CDCSegment3D.h>
15 #include <tracking/trackFindingCDC/eventdata/segments/CDCSegment2D.h>
16 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory3D.h>
17 
18 #include <tracking/trackFindingCDC/topology/CDCWireTopology.h>
19 
20 #include <tracking/trackFindingCDC/geometry/Helix.h>
21 
22 #include <tracking/trackFindingCDC/testFixtures/TrackFindingCDCTestWithTopology.h>
23 #include <tracking/trackFindingCDC/utilities/TimeIt.h>
24 
25 #include <array>
26 
27 namespace Belle2 {
32  namespace TrackFindingCDC {
33 
37 
38  public:
40  {
41  }
42 
44 
45  void SetUp() override
46  {
47 
50  bool run_disabled = ::testing::GTEST_FLAG(also_run_disabled_tests);
51  if (run_disabled) {
52  Belle2::LogSystem::Instance().getLogConfig()->setLogLevel(LogConfig::ELogLevel::c_Debug);
54  }
55 
56  m_plotter.clear();
57  m_mcAxialSegment2Ds.clear();
58  m_mcSegment2Ds.clear();
59  m_mcTracks.clear();
60  m_mcTrajectories.clear();
61  m_axialWireHits.clear();
62  m_wireHits.clear();
63  }
64 
66  void simulate(const std::initializer_list<Helix>& helices)
67  {
68  simulate(std::vector<Helix>(helices));
69  }
70 
71 
73  void simulate(const std::vector<Helix>& helices)
74  {
75  std::vector<CDCTrajectory3D> trajectories;
76  trajectories.reserve(helices.size());
77  for (const Helix& helix : helices) {
78  // had to make the implicit convesion to an explicit conversion. Maybe there is a more elegant way to do it
79  trajectories.emplace_back(UncertainHelix(helix));
80  }
81  simulate(trajectories);
82  }
83 
85  void simulate(const std::initializer_list<CDCTrajectory3D>& trajectories)
86  {
87  simulate(std::vector<CDCTrajectory3D>(trajectories));
88  }
89 
91  void simulate(const std::vector<CDCTrajectory3D>& trajectories)
92  {
93  m_mcTrajectories = trajectories;
94 
95  // Construct tracks. Wire hits are stored in the simple simulation
96  m_mcTracks = m_simpleSimulation.simulate(trajectories);
97 
98  fillCaches();
99  }
100 
103  {
104  // No trajectory information present
105  m_mcTrajectories.clear();
106 
107  // Load prepared tracks wire hits are stored in the simple simulation
109 
110  fillCaches();
111  }
112 
114  void fillCaches()
115  {
116  for (size_t iTrack = 0; iTrack < m_mcTracks.size(); ++iTrack) {
117  B2INFO("Size mc track " << iTrack << " : " << m_mcTracks[iTrack].size());
118  }
119 
120  // Prepare the monte carlo segments
121  for (const CDCTrack& mcTrack : m_mcTracks) {
122  std::vector<CDCSegment3D> segment3DsInTrack = mcTrack.splitIntoSegments();
123  for (const CDCSegment3D& segment3D : segment3DsInTrack) {
124  m_mcSegment2Ds.push_back(segment3D.stereoProjectToRef());
125  }
126  }
127 
128  // Filter the axial segments
129  for (const CDCSegment2D& segment2D : m_mcSegment2Ds) {
130  if (segment2D.getStereoKind() == EStereoKind::c_Axial) {
131  m_mcAxialSegment2Ds.push_back(&segment2D);
132  }
133  }
134 
135  // Filter for axial hits
136  for (const CDCWireHit& wireHit : m_simpleSimulation.getWireHits()) {
137  if (wireHit.isAxial()) {
138  m_axialWireHits.push_back(&wireHit);
139  }
140  }
141 
142  // Pick up points for all hits
143  for (const CDCWireHit& wireHit : m_simpleSimulation.getWireHits()) {
144  m_wireHits.push_back(&wireHit);
145  }
146 
148  for (const CDCWireHit& wireHit : m_simpleSimulation.getWireHits()) {
149  m_plotter.draw(wireHit);
150  }
151  }
152 
155  { for (const CDCTrack& mcTrack : m_mcTracks) m_plotter.draw(mcTrack); }
156 
159  {
160  for (const CDCTrajectory3D& mcTrajectory : m_mcTrajectories) {
161  m_plotter.draw(mcTrajectory.getTrajectory2D());
162  }
163  }
164 
166  void saveDisplay(const std::string& svgFileName)
167  {
168  bool run_disabled = ::testing::GTEST_FLAG(also_run_disabled_tests);
169  if (run_disabled) {
170  m_plotter.save(svgFileName);
171  } else {
172  B2INFO("Not writing display file. To activate svg display output run with --gtest_also_run_disabled_tests");
173  }
174  }
175 
181  template<class AFunction >
183  timeIt(size_t nExecutions,
184  bool activateCallgrind,
185  const AFunction& function,
186  const std::function<void()>& setUp = doNothing,
187  const std::function<void()>& tearDown = doNothing)
188  {
189  bool run_disabled = ::testing::GTEST_FLAG(also_run_disabled_tests);
190  if (not run_disabled) {
191  nExecutions = 1;
192  }
193  return Belle2::TrackFindingCDC::timeIt(nExecutions,
194  activateCallgrind,
195  function,
196  setUp,
197  tearDown);
198 
199  }
200 
202  template<class... Ts>
203  void draw(Ts&& ... args)
204  {
205  m_plotter.draw(std::forward<Ts>(args) ...);
206  }
207 
209  void TearDown() override
210  {
213 
214  m_plotter.clear();
215  m_mcAxialSegment2Ds.clear();
216  m_mcSegment2Ds.clear();
217  m_mcTracks.clear();
218  m_mcTrajectories.clear();
219  m_axialWireHits.clear();
220  m_wireHits.clear();
221  }
222 
223  protected:
226 
228  unsigned int m_savedDebugLogInfo = 100;
229 
231  const std::array<std::string, 6> m_colors{{ "red", "blue", "green", "yellow", "violet", "cyan" }};
232 
235 
237  std::vector<CDCTrajectory3D> m_mcTrajectories;
238 
240  std::vector<CDCTrack> m_mcTracks;
241 
243  std::vector<CDCSegment2D> m_mcSegment2Ds;
244 
246  std::vector<const CDCSegment2D*> m_mcAxialSegment2Ds;
247 
249  std::vector<const CDCWireHit*> m_axialWireHits;
250 
252  std::vector<const CDCWireHit*> m_wireHits;
253 
254  private:
257 
258  };
259 
260  }
262 }
ELogLevel getLogLevel() const
Returns the configured log level.
Definition: LogConfig.h:91
ELogLevel
Definition of the supported log levels.
Definition: LogConfig.h:26
@ c_Info
Info: for informational messages, e.g.
Definition: LogConfig.h:27
@ c_Debug
Debug: for code development.
Definition: LogConfig.h:26
unsigned int getLogInfo(ELogLevel logLevel) const
Returns the configured log information for the given level.
Definition: LogConfig.h:134
@ c_Level
Log level of the message.
Definition: LogConfig.h:36
@ c_Message
Log message text.
Definition: LogConfig.h:37
void setLogLevel(ELogLevel logLevel)
Configure the log level.
Definition: LogConfig.cc:25
void setLogInfo(ELogLevel logLevel, unsigned int logInfo)
Configure the printed log information for the given level.
Definition: LogConfig.h:127
LogConfig * getLogConfig()
Returns global log system configuration.
Definition: LogSystem.h:78
static LogSystem & Instance()
Static method to get a reference to the LogSystem instance.
Definition: LogSystem.cc:31
A reconstructed sequence of two dimensional hits in one super layer.
Definition: CDCSegment2D.h:39
A segment consisting of three dimensional reconstructed hits.
Definition: CDCSegment3D.h:26
Class providing a simple simulation of the CDC mainly for quick unit test checks.
ConstVectorRange< CDCWireHit > getWireHits() const
Getter for the wire hits created in the simulation.
std::vector< CDCTrack > simulate(const std::vector< CDCTrajectory3D > &trajectories3D)
Propagates the trajectories through the CDC as without energy loss until they first leave the CDC.
std::vector< CDCTrack > loadPreparedEvent()
Fills the wire hits with a hard coded event from the real simulation.
Class representing a sequence of three dimensional reconstructed hits.
Definition: CDCTrack.h:41
Particle full three dimensional trajectory.
Class representing a hit wire in the central drift chamber.
Definition: CDCWireHit.h:55
static CDCWireTopology & getInstance()
Getter for the singleton instance of the wire topology.
A class that can plot event related data types.
const std::string save(const std::string &fileName)
Saves the current plot stead to a file.
void clear()
Clears all drawed elements from the plotter.
void draw(const Belle2::TrackFindingCDC::Circle2D &circle, AttributeMap attributeMap=AttributeMap())
Draws a filled circle.
Extension of the generalized circle also caching the perigee coordinates.
Definition: Helix.h:28
Class to capture the time a repeated execution took.
Definition: TimeIt.h:29
void simulate(const std::vector< CDCTrajectory3D > &trajectories)
Populate the event with hits generated from the given trajectories.
void simulate(const std::initializer_list< CDCTrajectory3D > &trajectories)
Populate the event with hits generated from the given trajectories.
void simulate(const std::initializer_list< Helix > &helices)
Populate the event with hits generated from the given helices.
void draw(Ts &&... args)
Forwarding draw class to the plotter instance.
void saveDisplay(const std::string &svgFileName)
Save content of the plotter to svg file only if running in unrestricted mode –gtest_also_run_disabled...
std::vector< CDCTrack > m_mcTracks
Memory for the Monte Carlo tracks of the current event.
std::vector< const CDCSegment2D * > m_mcAxialSegment2Ds
Memory for the axial Monte Carlo segments of the current event.
std::vector< CDCSegment2D > m_mcSegment2Ds
Memory for the Monte Carlo segments of the current event.
void loadPreparedEvent()
Populate the event with hits hard codes presimulated hits.
CDCSimpleSimulation m_simpleSimulation
Simple simulation generating the hits.
void simulate(const std::vector< Helix > &helices)
Populate the event with hits generated from the given helices.
TimeItResult timeIt(size_t nExecutions, bool activateCallgrind, const AFunction &function, const std::function< void()> &setUp=doNothing, const std::function< void()> &tearDown=doNothing)
Repeat a time critical simulation section a couple of times.
EventDataPlotter m_plotter
Plotter facility to generate visual representations.
std::vector< const CDCWireHit * > m_wireHits
Memory for the hits of the current event.
void plotMCTrajectories()
Add the Monte Carlo trajectories to the event plot.
LogConfig::ELogLevel m_savedLogLevel
Memory for the log level that was set before the test.
void fillCaches()
Prepare a set of hits, axial hits, segments, axial segments and track hits.
std::vector< const CDCWireHit * > m_axialWireHits
Memory for the axial hits of the current event.
unsigned int m_savedDebugLogInfo
Memory for the log info of debug that was set before the test.
std::vector< CDCTrajectory3D > m_mcTrajectories
Memory for the Monte Carlo trajectories of the current event.
const std::array< std::string, 6 > m_colors
Some colors to cycle for plotting.
This class provides the declaration of the common test fixture to all test of the track finding in th...
A general helix class including a covariance matrix.
Abstract base class for different kinds of events.