Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
VisualMonitoringAlgorithm.cc
Go to the documentation of this file.
1
10
12
13using namespace pandora;
14
15namespace lar_content
16{
17
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 {
52 this->VisualizeMCParticleList(std::string());
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 {
64 this->VisualizeCaloHitList(std::string());
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 {
76 this->VisualizeClusterList(std::string());
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 {
88 this->VisualizeTrackList(std::string());
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 {
100 this->VisualizeParticleFlowList(std::string());
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 {
112 this->VisualizeVertexList(std::string());
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
137void VisualMonitoringAlgorithm::VisualizeMCParticleList(const std::string &listName) const
138{
139 const MCParticleList *pMCParticleList = NULL;
140
141 if (listName.empty())
142 {
143 if (STATUS_CODE_SUCCESS != PandoraContentApi::GetCurrentList(*this, pMCParticleList))
144 {
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 {
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
166void VisualMonitoringAlgorithm::VisualizeCaloHitList(const std::string &listName) const
167{
168 const CaloHitList *pCaloHitList = NULL;
169
170 if (listName.empty())
171 {
172 if (STATUS_CODE_SUCCESS != PandoraContentApi::GetCurrentList(*this, pCaloHitList))
173 {
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 {
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
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
208void VisualMonitoringAlgorithm::VisualizeTrackList(const std::string &listName) const
209{
210 const TrackList *pTrackList = NULL;
211
212 if (listName.empty())
213 {
214 if (STATUS_CODE_SUCCESS != PandoraContentApi::GetCurrentList(*this, pTrackList))
215 {
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 {
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
247void VisualMonitoringAlgorithm::VisualizeClusterList(const std::string &listName) const
248{
249 const ClusterList *pClusterList = NULL;
250
251 if (listName.empty())
252 {
253 if (STATUS_CODE_SUCCESS != PandoraContentApi::GetCurrentList(*this, pClusterList))
254 {
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 {
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
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
290void VisualMonitoringAlgorithm::VisualizeParticleFlowList(const std::string &listName) const
291{
292 const PfoList *pPfoList = NULL;
293
294 if (listName.empty())
295 {
296 if (STATUS_CODE_SUCCESS != PandoraContentApi::GetCurrentList(*this, pPfoList))
297 {
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 {
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
322void VisualMonitoringAlgorithm::VisualizeVertexList(const std::string &listName) const
323{
324 const VertexList *pVertexList = NULL;
325
326 if (listName.empty())
327 {
328 if (STATUS_CODE_SUCCESS != PandoraContentApi::GetCurrentList(*this, pVertexList))
329 {
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 {
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
362{
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
370 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowCurrentCaloHits", m_showCurrentCaloHits));
371
373 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "CaloHitListNames", m_caloHitListNames));
374
376 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowCurrentTracks", m_showCurrentTracks));
377
379 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "TrackListNames", m_trackListNames));
380
382 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowCurrentClusters", m_showCurrentClusters));
383
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
390 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "PfoListNames", m_pfoListNames));
391
393 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowCurrentVertices", m_showCurrentVertices));
394
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
408 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ShowOnlyAvailable", m_showOnlyAvailable));
409
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
419 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "TransparencyThresholdE", m_transparencyThresholdE));
420
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
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
Grouping of header files for many classes of use in particle flow algorithms.
#define PANDORA_MONITORING_API(command)
#define PANDORA_RETURN_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
Definition StatusCodes.h:31
Header file for the visual monitoring algorithm class.
static bool IsAvailable(const pandora::Algorithm &algorithm, const T *const pT)
Is object, or a list of objects, available as a building block.
static pandora::StatusCode GetCurrentList(const pandora::Algorithm &algorithm, const T *&pT)
Get the current list.
static pandora::StatusCode GetList(const pandora::Algorithm &algorithm, const std::string &listName, const T *&pT)
Get a named list.
static const pandora::PandoraSettings * GetSettings(const pandora::Algorithm &algorithm)
Get the pandora settings instance.
pandora::StringVector m_trackListNames
Names of track lists to show.
pandora::StringVector m_pfoListNames
Names of pfo lists to show.
void VisualizeParticleFlowList(const std::string &listName) const
Visualize a specified pfo list.
bool m_showCurrentCaloHits
Whether to show current calohitlist.
pandora::StatusCode Run()
Run the algorithm.
pandora::StringVector m_clusterListNames
Names of cluster lists to show.
std::string m_detectorView
The detector view, default, xy or xz.
bool m_showPfoVertices
Whether to display pfo vertices.
bool m_showOnlyAvailable
Whether to show only available (i.e. non-clustered) calohits and tracks.
float m_thresholdEnergy
Cell energy threshold for display (em scale)
bool m_showCurrentClusters
Whether to show current clusters.
pandora::StringVector m_vertexListNames
Names of vertex lists to show.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
void VisualizeCaloHitList(const std::string &listName) const
Visualize a specified calo hit list.
bool m_showPfoHierarchy
Whether to display daughter pfos only under parent pfo elements.
pandora::StringVector m_caloHitListNames
Names of calo hit lists to show.
void VisualizeVertexList(const std::string &listName) const
Visualize a specified vertex list.
bool m_showAssociatedTracks
Whether to display tracks associated to clusters when viewing cluster lists.
bool m_showCurrentTracks
Whether to show current tracks.
bool m_showCurrentVertices
Whether to show current vertex list.
float m_transparencyThresholdE
Cell energy for which transparency is saturated (0%, fully opaque)
bool m_showCurrentPfos
Whether to show current particle flow object list.
pandora::StringVector m_suppressMCParticles
List of PDG numbers and energies for MC particles to be suppressed (e.g. " 22:0.1 2112:1....
std::string m_hitColors
Define the hit coloring scheme (default: pfo, choices: pfo, particleid)
bool m_displayEvent
Whether to display the event.
bool m_showDetector
Whether to display the detector geometry.
pandora::StringVector m_mcParticleListNames
Names of mc particles lists to show.
void VisualizeClusterList(const std::string &listName) const
Visualize a specified calo hit list.
float m_scalingFactor
TEve works with [cm], Pandora usually works with [mm] (but LArContent went with cm too)
void VisualizeTrackList(const std::string &listName) const
Visualize a specified track list.
PdgCodeToEnergyMap m_particleSuppressionMap
Map from pdg-codes to energy for suppression of particles types below specific energies.
float m_energyScaleThresholdE
Cell energy for which color is at top end of continous color palette.
std::string m_saveEventPath
The path to save event displays to. m_displayEvent must also be set.
bool m_showCurrentMCParticles
Whether to show current mc particles.
void VisualizeMCParticleList(const std::string &listName) const
Visualize mc particle list.
CaloHit class.
Definition CaloHit.h:26
float GetElectromagneticEnergy() const
Get the calibrated electromagnetic energy measure.
Definition CaloHit.h:483
Cluster class.
Definition Cluster.h:31
bool ShouldDisplayAlgorithmInfo() const
Whether to display algorithm information during processing.
const Pandora & GetPandora() const
Get the associated pandora instance.
Definition Process.h:116
Track class.
Definition Track.h:26
bool IsAvailable() const
Whether the track is available to be added to a particle flow object.
Definition Track.h:442
Vertex class.
Definition Vertex.h:26
bool IsAvailable() const
Whether the vertex is available to be added to a particle flow object.
Definition Vertex.h:131
static void TokenizeString(const std::string &inputString, StringVector &tokens, const std::string &delimiter=" ")
Tokenize a string.
Definition XmlHelper.cc:122
static StatusCode ReadVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, std::vector< T > &vector)
Read a vector of values from a (space separated) list in an xml element.
Definition XmlHelper.h:229
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
Definition XmlHelper.h:136
MANAGED_CONTAINER< const MCParticle * > MCParticleList
bool StringToType(const std::string &s, T &t)
MANAGED_CONTAINER< const Cluster * > ClusterList
std::vector< std::string > StringVector
MANAGED_CONTAINER< const CaloHit * > CaloHitList
MANAGED_CONTAINER< const Track * > TrackList
MANAGED_CONTAINER< const Vertex * > VertexList
StatusCode
The StatusCode enum.
MANAGED_CONTAINER< const ParticleFlowObject * > PfoList