Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
CheatingEventSlicingTool.cc
Go to the documentation of this file.
1
10
12
14
15using namespace pandora;
16
17namespace lar_content
18{
19
23
24//------------------------------------------------------------------------------------------------------------------------------------------
25
26void CheatingEventSlicingTool::RunSlicing(const Algorithm *const pAlgorithm, const HitTypeToNameMap &caloHitListNames,
27 const HitTypeToNameMap & /*clusterListNames*/, SliceList &sliceList)
28{
30 std::cout << "----> Running Algorithm Tool: " << this->GetInstanceName() << ", " << this->GetType() << std::endl;
31
32 MCParticleToSliceMap mcParticleToSliceMap;
33 this->InitializeMCParticleToSliceMap(pAlgorithm, caloHitListNames, mcParticleToSliceMap);
34
35 this->FillSlices(pAlgorithm, TPC_VIEW_U, caloHitListNames, mcParticleToSliceMap);
36 this->FillSlices(pAlgorithm, TPC_VIEW_V, caloHitListNames, mcParticleToSliceMap);
37 this->FillSlices(pAlgorithm, TPC_VIEW_W, caloHitListNames, mcParticleToSliceMap);
38
39 MCParticleVector mcParticleVector;
40 for (const auto &mapEntry : mcParticleToSliceMap)
41 mcParticleVector.push_back(mapEntry.first);
42 std::sort(mcParticleVector.begin(), mcParticleVector.end(), LArMCParticleHelper::SortByMomentum);
43
44 for (const MCParticle *const pMCParticle : mcParticleVector)
45 {
46 const Slice &slice(mcParticleToSliceMap.at(pMCParticle));
47
48 if (!slice.m_caloHitListU.empty() || !slice.m_caloHitListV.empty() || !slice.m_caloHitListW.empty())
49 sliceList.push_back(slice);
50 }
51}
52
53//------------------------------------------------------------------------------------------------------------------------------------------
54
56 const Algorithm *const pAlgorithm, const HitTypeToNameMap &caloHitListNames, MCParticleToSliceMap &mcParticleToSliceMap) const
57{
58 for (const auto &mapEntry : caloHitListNames)
59 {
60 const CaloHitList *pCaloHitList(nullptr);
61 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*pAlgorithm, mapEntry.second, pCaloHitList));
62
63 for (const CaloHit *const pCaloHit : *pCaloHitList)
64 {
65 MCParticleVector mcParticleVector;
66 for (const auto &weightMapEntry : pCaloHit->GetMCParticleWeightMap())
67 mcParticleVector.push_back(weightMapEntry.first);
68 std::sort(mcParticleVector.begin(), mcParticleVector.end(), LArMCParticleHelper::SortByMomentum);
69
70 for (const MCParticle *const pMCParticle : mcParticleVector)
71 {
72 const MCParticle *const pParentMCParticle(LArMCParticleHelper::GetParentMCParticle(pMCParticle));
73
74 if (mcParticleToSliceMap.count(pParentMCParticle))
75 continue;
76
77 if (!mcParticleToSliceMap.insert(MCParticleToSliceMap::value_type(pParentMCParticle, Slice())).second)
78 throw StatusCodeException(STATUS_CODE_FAILURE);
79 }
80 }
81 }
82}
83
84//------------------------------------------------------------------------------------------------------------------------------------------
85
86void CheatingEventSlicingTool::FillSlices(const Algorithm *const pAlgorithm, const HitType hitType,
87 const HitTypeToNameMap &caloHitListNames, MCParticleToSliceMap &mcParticleToSliceMap) const
88{
89 if ((TPC_VIEW_U != hitType) && (TPC_VIEW_V != hitType) && (TPC_VIEW_W != hitType))
90 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
91
92 const CaloHitList *pCaloHitList(nullptr);
93 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*pAlgorithm, caloHitListNames.at(hitType), pCaloHitList));
94
95 for (const CaloHit *const pCaloHit : *pCaloHitList)
96 {
97 try
98 {
99 const MCParticle *const pMainMCParticle(MCParticleHelper::GetMainMCParticle(pCaloHit));
100 const MCParticle *const pParentMCParticle(LArMCParticleHelper::GetParentMCParticle(pMainMCParticle));
101
102 MCParticleToSliceMap::iterator mapIter = mcParticleToSliceMap.find(pParentMCParticle);
103
104 if (mcParticleToSliceMap.end() == mapIter)
105 throw StatusCodeException(STATUS_CODE_FAILURE);
106
107 Slice &slice(mapIter->second);
108 CaloHitList &caloHitList((TPC_VIEW_U == hitType) ? slice.m_caloHitListU : (TPC_VIEW_V == hitType) ? slice.m_caloHitListV : slice.m_caloHitListW);
109 caloHitList.push_back(pCaloHit);
110 }
111 catch (const StatusCodeException &statusCodeException)
112 {
113 if (STATUS_CODE_FAILURE == statusCodeException.GetStatusCode())
114 throw statusCodeException;
115 }
116 }
117}
118
119//------------------------------------------------------------------------------------------------------------------------------------------
120
122{
123 return STATUS_CODE_SUCCESS;
124}
125
126} // namespace lar_content
Grouping of header files for many classes of use in particle flow algorithms.
Header file for the cheating event slicing tool class.
Header file for the lar monte carlo particle helper helper class.
#define PANDORA_THROW_RESULT_IF(StatusCode1, Operator, Command)
Definition StatusCodes.h:43
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.
void FillSlices(const pandora::Algorithm *const pAlgorithm, const pandora::HitType hitType, const SlicingAlgorithm::HitTypeToNameMap &caloHitListNames, MCParticleToSliceMap &mcParticleToSliceMap) const
Fill slices using hits from a specified view.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
void RunSlicing(const pandora::Algorithm *const pAlgorithm, const SlicingAlgorithm::HitTypeToNameMap &caloHitListNames, const SlicingAlgorithm::HitTypeToNameMap &clusterListNames, SlicingAlgorithm::SliceList &sliceList)
Run the slicing tool.
std::unordered_map< const pandora::MCParticle *, SlicingAlgorithm::Slice > MCParticleToSliceMap
void InitializeMCParticleToSliceMap(const pandora::Algorithm *const pAlgorithm, const SlicingAlgorithm::HitTypeToNameMap &caloHitListNames, MCParticleToSliceMap &mcParticleToSliceMap) const
Initialize the map from parent mc particles to slice objects.
static bool SortByMomentum(const pandora::MCParticle *const pLhs, const pandora::MCParticle *const pRhs)
Sort mc particles by their momentum.
static const pandora::MCParticle * GetParentMCParticle(const pandora::MCParticle *const pMCParticle)
Get the parent mc particle.
pandora::CaloHitList m_caloHitListW
The w calo hit list.
std::map< pandora::HitType, std::string > HitTypeToNameMap
pandora::CaloHitList m_caloHitListU
The u calo hit list.
std::vector< Slice > SliceList
pandora::CaloHitList m_caloHitListV
The v calo hit list.
Algorithm class. Algorithm addresses are held only by the algorithm manager. They have a fully define...
Definition Algorithm.h:21
CaloHit class.
Definition CaloHit.h:26
static const MCParticle * GetMainMCParticle(const T *const pT)
Find the mc particle making the largest contribution to a specified calo hit, track or cluster.
MCParticle class.
Definition MCParticle.h:26
bool ShouldDisplayAlgorithmInfo() const
Whether to display algorithm information during processing.
const std::string & GetType() const
Get the type.
Definition Process.h:102
const std::string & GetInstanceName() const
Get the instance name.
Definition Process.h:109
StatusCodeException class.
StatusCode GetStatusCode() const
Get status code.
SlicingAlgorithm::SliceList SliceList
SlicingAlgorithm::HitTypeToNameMap HitTypeToNameMap
SlicingAlgorithm::Slice Slice
HitType
Calorimeter hit type enum.
MANAGED_CONTAINER< const CaloHit * > CaloHitList
std::vector< const MCParticle * > MCParticleVector
StatusCode
The StatusCode enum.