VisualMonitoringAlgorithm.cc
Go to the documentation of this file.
1 /**
2  * @file larpandoracontent/LArMonitoring/VisualMonitoringAlgorithm.cc
3  *
4  * @brief Implementation of the visual monitoring algorithm class
5  *
6  * $Log: $
7  */
8 
9 #include "Pandora/AlgorithmHeaders.h"
10 
12 
13 using namespace pandora;
14 
15 namespace lar_content
16 {
17 
18 VisualMonitoringAlgorithm::VisualMonitoringAlgorithm() :
19  m_showCurrentMCParticles(false),
20  m_showCurrentCaloHits(false),
21  m_showCurrentTracks(false),
22  m_showCurrentClusters(false),
23  m_showCurrentPfos(false),
24  m_showCurrentVertices(false),
25  m_displayEvent(true),
26  m_saveEventPath(""),
27  m_showDetector(false),
28  m_detectorView("xz"),
29  m_showOnlyAvailable(false),
30  m_showAssociatedTracks(false),
31  m_hitColors("iterate"),
32  m_thresholdEnergy(-1.f),
33  m_transparencyThresholdE(-1.f),
34  m_energyScaleThresholdE(1.f),
35  m_scalingFactor(1.f),
36  m_showPfoVertices(true),
37  m_showPfoHierarchy(true)
38 {
39 }
40 
41 //------------------------------------------------------------------------------------------------------------------------------------------
42 
44 {
45  PANDORA_MONITORING_API(SetEveDisplayParameters(this->GetPandora(), m_showDetector,
46  (m_detectorView.find("xz") != std::string::npos) ? DETECTOR_VIEW_XZ : (m_detectorView.find("xy") != std::string::npos) ? DETECTOR_VIEW_XY : DETECTOR_VIEW_DEFAULT,
48 
49  // Show current mc particles
51  {
53  }
54 
55  // Show specified lists of mc particles
56  for (StringVector::const_iterator iter = m_mcParticleListNames.begin(), iterEnd = m_mcParticleListNames.end(); iter != iterEnd; ++iter)
57  {
58  this->VisualizeMCParticleList(*iter);
59  }
60 
61  // Show current calo hit list
63  {
65  }
66 
67  // Show specified lists of calo hits
68  for (StringVector::const_iterator iter = m_caloHitListNames.begin(), iterEnd = m_caloHitListNames.end(); iter != iterEnd; ++iter)
69  {
70  this->VisualizeCaloHitList(*iter);
71  }
72 
73  // Show current cluster list
75  {
77  }
78 
79  // Show specified lists of clusters
80  for (StringVector::const_iterator iter = m_clusterListNames.begin(), iterEnd = m_clusterListNames.end(); iter != iterEnd; ++iter)
81  {
82  this->VisualizeClusterList(*iter);
83  }
84 
85  // Show current track list
87  {
89  }
90 
91  // Show specified lists of tracks
92  for (StringVector::const_iterator iter = m_trackListNames.begin(), iterEnd = m_trackListNames.end(); iter != iterEnd; ++iter)
93  {
94  this->VisualizeTrackList(*iter);
95  }
96 
97  // Show current particle flow objects
99  {
101  }
102 
103  // Show specified lists of pfo
104  for (StringVector::const_iterator iter = m_pfoListNames.begin(), iterEnd = m_pfoListNames.end(); iter != iterEnd; ++iter)
105  {
106  this->VisualizeParticleFlowList(*iter);
107  }
108 
109  // Show current vertex objects
111  {
113  }
114 
115  // Show specified lists of vertices
116  for (StringVector::const_iterator iter = m_vertexListNames.begin(), iterEnd = m_vertexListNames.end(); iter != iterEnd; ++iter)
117  {
118  this->VisualizeVertexList(*iter);
119  }
120 
121  // Finally, display the event and pause application
122  // Save the event displays of the event if given a path to save to.
123  if (m_displayEvent && m_saveEventPath != "")
124  {
125  PANDORA_MONITORING_API(SaveAndViewEvent(this->GetPandora(), m_saveEventPath));
126  }
127  else if (m_displayEvent)
128  {
129  PANDORA_MONITORING_API(ViewEvent(this->GetPandora()));
130  }
131 
132  return STATUS_CODE_SUCCESS;
133 }
134 
135 //------------------------------------------------------------------------------------------------------------------------------------------
136 
138 {
139  const MCParticleList *pMCParticleList = NULL;
140 
141  if (listName.empty())
142  {
143  if (STATUS_CODE_SUCCESS != PandoraContentApi::GetCurrentList(*this, pMCParticleList))
144  {
145  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
146  std::cout << "VisualMonitoringAlgorithm: mc particle list unavailable." << std::endl;
147  return;
148  }
149  }
150  else
151  {
152  if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*this, listName, pMCParticleList))
153  {
154  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
155  std::cout << "VisualMonitoringAlgorithm: mc particle list unavailable." << std::endl;
156  return;
157  }
158  }
159 
160  PANDORA_MONITORING_API(VisualizeMCParticles(
161  this->GetPandora(), pMCParticleList, listName.empty() ? "CurrentMCParticles" : listName.c_str(), AUTO, &m_particleSuppressionMap));
162 }
163 
164 //------------------------------------------------------------------------------------------------------------------------------------------
165 
167 {
168  const CaloHitList *pCaloHitList = NULL;
169 
170  if (listName.empty())
171  {
172  if (STATUS_CODE_SUCCESS != PandoraContentApi::GetCurrentList(*this, pCaloHitList))
173  {
174  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
175  std::cout << "VisualMonitoringAlgorithm: current calo hit list unavailable." << std::endl;
176  return;
177  }
178  }
179  else
180  {
181  if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*this, listName, pCaloHitList))
182  {
183  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
184  std::cout << "VisualMonitoringAlgorithm: calo hit list " << listName << " unavailable." << std::endl;
185  return;
186  }
187  }
188 
189  // Filter calo hit list
190  CaloHitList caloHitList;
191 
192  for (CaloHitList::const_iterator iter = pCaloHitList->begin(), iterEnd = pCaloHitList->end(); iter != iterEnd; ++iter)
193  {
194  const CaloHit *const pCaloHit = *iter;
195 
196  if ((pCaloHit->GetElectromagneticEnergy() > m_thresholdEnergy) && (!m_showOnlyAvailable || PandoraContentApi::IsAvailable(*this, pCaloHit)))
197  {
198  caloHitList.push_back(pCaloHit);
199  }
200  }
201 
202  PANDORA_MONITORING_API(VisualizeCaloHits(this->GetPandora(), &caloHitList, listName.empty() ? "CurrentCaloHits" : listName.c_str(),
203  (m_hitColors.find("energy") != std::string::npos ? AUTOENERGY : GRAY)));
204 }
205 
206 //------------------------------------------------------------------------------------------------------------------------------------------
207 
209 {
210  const TrackList *pTrackList = NULL;
211 
212  if (listName.empty())
213  {
214  if (STATUS_CODE_SUCCESS != PandoraContentApi::GetCurrentList(*this, pTrackList))
215  {
216  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
217  std::cout << "VisualMonitoringAlgorithm: current track list unavailable." << std::endl;
218  return;
219  }
220  }
221  else
222  {
223  if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*this, listName, pTrackList))
224  {
225  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
226  std::cout << "VisualMonitoringAlgorithm: track list " << listName << " unavailable." << std::endl;
227  return;
228  }
229  }
230 
231  // Filter track list
232  TrackList trackList;
233 
234  for (TrackList::const_iterator iter = pTrackList->begin(), iterEnd = pTrackList->end(); iter != iterEnd; ++iter)
235  {
236  const Track *const pTrack = *iter;
237 
238  if (!m_showOnlyAvailable || pTrack->IsAvailable())
239  trackList.push_back(pTrack);
240  }
241 
242  PANDORA_MONITORING_API(VisualizeTracks(this->GetPandora(), &trackList, listName.empty() ? "CurrentTracks" : listName.c_str(), GRAY));
243 }
244 
245 //------------------------------------------------------------------------------------------------------------------------------------------
246 
248 {
249  const ClusterList *pClusterList = NULL;
250 
251  if (listName.empty())
252  {
253  if (STATUS_CODE_SUCCESS != PandoraContentApi::GetCurrentList(*this, pClusterList))
254  {
255  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
256  std::cout << "VisualMonitoringAlgorithm: current cluster list unavailable." << std::endl;
257  return;
258  }
259  }
260  else
261  {
262  if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*this, listName, pClusterList))
263  {
264  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
265  std::cout << "VisualMonitoringAlgorithm: cluster list " << listName << " unavailable." << std::endl;
266  return;
267  }
268  }
269 
270  // Filter cluster list
271  ClusterList clusterList;
272 
273  for (ClusterList::const_iterator iter = pClusterList->begin(), iterEnd = pClusterList->end(); iter != iterEnd; ++iter)
274  {
275  const Cluster *const pCluster = *iter;
276 
277  if (!m_showOnlyAvailable || PandoraContentApi::IsAvailable(*this, pCluster))
278  clusterList.push_back(pCluster);
279  }
280 
281  PANDORA_MONITORING_API(VisualizeClusters(this->GetPandora(), &clusterList, listName.empty() ? "CurrentClusters" : listName.c_str(),
282  (m_hitColors.find("particleid") != std::string::npos)
283  ? AUTOID
284  : (m_hitColors.find("iterate") != std::string::npos) ? AUTOITER : (m_hitColors.find("energy") != std::string::npos) ? AUTOENERGY : AUTO,
286 }
287 
288 //------------------------------------------------------------------------------------------------------------------------------------------
289 
291 {
292  const PfoList *pPfoList = NULL;
293 
294  if (listName.empty())
295  {
296  if (STATUS_CODE_SUCCESS != PandoraContentApi::GetCurrentList(*this, pPfoList))
297  {
298  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
299  std::cout << "VisualMonitoringAlgorithm: current pfo list unavailable." << std::endl;
300  return;
301  }
302  }
303  else
304  {
305  if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*this, listName, pPfoList))
306  {
307  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
308  std::cout << "VisualMonitoringAlgorithm: pfo list " << listName << " unavailable." << std::endl;
309  return;
310  }
311  }
312 
313  PANDORA_MONITORING_API(VisualizeParticleFlowObjects(this->GetPandora(), pPfoList, listName.empty() ? "CurrentPfos" : listName.c_str(),
314  (m_hitColors.find("particleid") != std::string::npos)
315  ? AUTOID
316  : (m_hitColors.find("iterate") != std::string::npos ? AUTOITER : (m_hitColors.find("energy") != std::string::npos ? AUTOENERGY : AUTO)),
318 }
319 
320 //------------------------------------------------------------------------------------------------------------------------------------------
321 
323 {
324  const VertexList *pVertexList = NULL;
325 
326  if (listName.empty())
327  {
328  if (STATUS_CODE_SUCCESS != PandoraContentApi::GetCurrentList(*this, pVertexList))
329  {
330  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
331  std::cout << "VisualMonitoringAlgorithm: current vertex list unavailable." << std::endl;
332  return;
333  }
334  }
335  else
336  {
337  if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*this, listName, pVertexList))
338  {
339  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
340  std::cout << "VisualMonitoringAlgorithm: vertex list " << listName << " unavailable." << std::endl;
341  return;
342  }
343  }
344 
345  // Filter vertex list
346  VertexList vertexList;
347 
348  for (VertexList::const_iterator iter = pVertexList->begin(), iterEnd = pVertexList->end(); iter != iterEnd; ++iter)
349  {
350  const Vertex *const pVertex = *iter;
351 
352  if (!m_showOnlyAvailable || pVertex->IsAvailable())
353  vertexList.push_back(pVertex);
354  }
355 
356  PANDORA_MONITORING_API(VisualizeVertices(this->GetPandora(), &vertexList, listName.empty() ? "CurrentVertices" : listName.c_str(), AUTO));
357 }
358 
359 //------------------------------------------------------------------------------------------------------------------------------------------
360 
361 StatusCode VisualMonitoringAlgorithm::ReadSettings(const TiXmlHandle xmlHandle)
362 {
363  PANDORA_RETURN_RESULT_IF_AND_IF(
364  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowCurrentMCParticles", m_showCurrentMCParticles));
365 
366  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
367  XmlHelper::ReadVectorOfValues(xmlHandle, "MCParticleListNames", m_mcParticleListNames));
368 
369  PANDORA_RETURN_RESULT_IF_AND_IF(
370  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowCurrentCaloHits", m_showCurrentCaloHits));
371 
372  PANDORA_RETURN_RESULT_IF_AND_IF(
373  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "CaloHitListNames", m_caloHitListNames));
374 
375  PANDORA_RETURN_RESULT_IF_AND_IF(
376  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowCurrentTracks", m_showCurrentTracks));
377 
378  PANDORA_RETURN_RESULT_IF_AND_IF(
379  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "TrackListNames", m_trackListNames));
380 
381  PANDORA_RETURN_RESULT_IF_AND_IF(
382  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowCurrentClusters", m_showCurrentClusters));
383 
384  PANDORA_RETURN_RESULT_IF_AND_IF(
385  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "ClusterListNames", m_clusterListNames));
386 
387  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowCurrentPfos", m_showCurrentPfos));
388 
389  PANDORA_RETURN_RESULT_IF_AND_IF(
390  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "PfoListNames", m_pfoListNames));
391 
392  PANDORA_RETURN_RESULT_IF_AND_IF(
393  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowCurrentVertices", m_showCurrentVertices));
394 
395  PANDORA_RETURN_RESULT_IF_AND_IF(
396  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "VertexListNames", m_vertexListNames));
397 
398  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "DisplayEvent", m_displayEvent));
399 
400  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "SaveEventPath", m_saveEventPath));
401 
402  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowDetector", m_showDetector));
403 
404  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "DetectorView", m_detectorView));
405  std::transform(m_detectorView.begin(), m_detectorView.end(), m_detectorView.begin(), ::tolower);
406 
407  PANDORA_RETURN_RESULT_IF_AND_IF(
408  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowOnlyAvailable", m_showOnlyAvailable));
409 
410  PANDORA_RETURN_RESULT_IF_AND_IF(
411  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowAssociatedTracks", m_showAssociatedTracks));
412 
413  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "HitColors", m_hitColors));
414  std::transform(m_hitColors.begin(), m_hitColors.end(), m_hitColors.begin(), ::tolower);
415 
416  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ThresholdEnergy", m_thresholdEnergy));
417 
418  PANDORA_RETURN_RESULT_IF_AND_IF(
419  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "TransparencyThresholdE", m_transparencyThresholdE));
420 
421  PANDORA_RETURN_RESULT_IF_AND_IF(
422  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "EnergyScaleThresholdE", m_energyScaleThresholdE));
423 
424  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ScalingFactor", m_scalingFactor));
425 
426  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowPfoVertices", m_showPfoVertices));
427 
428  PANDORA_RETURN_RESULT_IF_AND_IF(
429  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowPfoHierarchy", m_showPfoHierarchy));
430 
431  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
432  XmlHelper::ReadVectorOfValues(xmlHandle, "SuppressMCParticles", m_suppressMCParticles));
433 
434  for (StringVector::iterator iter = m_suppressMCParticles.begin(), iterEnd = m_suppressMCParticles.end(); iter != iterEnd; ++iter)
435  {
436  const std::string pdgEnergy(*iter);
437  StringVector pdgEnergySeparated;
438  const std::string delimiter = ":";
439  XmlHelper::TokenizeString(pdgEnergy, pdgEnergySeparated, delimiter);
440 
441  if (pdgEnergySeparated.size() != 2)
442  return STATUS_CODE_INVALID_PARAMETER;
443 
444  int pdgCode(0);
445  float energy(0.f);
446 
447  if (!StringToType(pdgEnergySeparated.at(0), pdgCode) || !StringToType(pdgEnergySeparated.at(1), energy))
448  return STATUS_CODE_INVALID_PARAMETER;
449 
450  m_particleSuppressionMap.insert(PdgCodeToEnergyMap::value_type(pdgCode, energy));
451  }
452 
453  return STATUS_CODE_SUCCESS;
454 }
455 
456 } // namespace lar_content
pandora::StringVector m_pfoListNames
Names of pfo lists to show.
intermediate_table::iterator iterator
std::string m_saveEventPath
The path to save event displays to. m_displayEvent must also be set.
pandora::StringVector m_caloHitListNames
Names of calo hit lists to show.
void VisualizeCaloHitList(const std::string &listName) const
Visualize a specified calo hit list.
float m_transparencyThresholdE
Cell energy for which transparency is saturated (0%, fully opaque)
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
std::string string
Definition: nybbler.cc:12
bool m_showCurrentVertices
Whether to show current vertex list.
void VisualizeParticleFlowList(const std::string &listName) const
Visualize a specified pfo list.
pandora::StringVector m_vertexListNames
Names of vertex lists to show.
bool m_showCurrentCaloHits
Whether to show current calohitlist.
std::set< const gar::rec::Track * > TrackList
Definition: TrackCreator.h:14
bool m_showCurrentPfos
Whether to show current particle flow object list.
intermediate_table::const_iterator const_iterator
void VisualizeTrackList(const std::string &listName) const
Visualize a specified track list.
bool m_showDetector
Whether to display the detector geometry.
bool m_showCurrentMCParticles
Whether to show current mc particles.
float m_scalingFactor
TEve works with [cm], Pandora usually works with [mm] (but LArContent went with cm too) ...
bool m_showPfoHierarchy
Whether to display daughter pfos only under parent pfo elements.
float m_thresholdEnergy
Cell energy threshold for display (em scale)
bool m_showAssociatedTracks
Whether to display tracks associated to clusters when viewing cluster lists.
bool m_showOnlyAvailable
Whether to show only available (i.e. non-clustered) calohits and tracks.
pandora::StringVector m_suppressMCParticles
List of PDG numbers and energies for MC particles to be suppressed (e.g. " 22:0.1 2112:1...
bool m_showCurrentClusters
Whether to show current clusters.
pandora::StringVector m_mcParticleListNames
Names of mc particles lists to show.
bool m_showPfoVertices
Whether to display pfo vertices.
void VisualizeMCParticleList(const std::string &listName) const
Visualize mc particle list.
void VisualizeVertexList(const std::string &listName) const
Visualize a specified vertex list.
std::vector< string > StringVector
Definition: fcldump.cxx:29
void VisualizeClusterList(const std::string &listName) const
Visualize a specified calo hit list.
float m_energyScaleThresholdE
Cell energy for which color is at top end of continous color palette.
Header file for the visual monitoring algorithm class.
bool m_showCurrentTracks
Whether to show current tracks.
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
TrackCollectionProxyElement< TrackCollProxy > Track
Proxy to an element of a proxy collection of recob::Track objects.
Definition: Track.h:1036
std::string m_detectorView
The detector view, default, xy or xz.
pandora::StringVector m_clusterListNames
Names of cluster lists to show.
bool m_displayEvent
Whether to display the event.
pandora::StringVector m_trackListNames
Names of track lists to show.
std::list< Vertex > VertexList
Definition: DCEL.h:182
QTextStream & endl(QTextStream &s)
PdgCodeToEnergyMap m_particleSuppressionMap
Map from pdg-codes to energy for suppression of particles types below specific energies.
std::string m_hitColors
Define the hit coloring scheme (default: pfo, choices: pfo, particleid)