10 #include "cetlib_except/exception.h" 24 #include "Objects/CaloHit.h" 25 #include "Objects/Cluster.h" 26 #include "Objects/ParticleFlowObject.h" 27 #include "Objects/Vertex.h" 46 const std::string instanceLabel(
48 const std::string testBeamInteractionVertexInstanceLabel(
57 new std::vector<larpandoraobj::PFParticleMetadata>);
92 const pandora::PfoVector pfoVector(
103 pfoToTestBeamInteractionVerticesMap,
108 const pandora::ClusterList clusterList(
112 const pandora::CaloHitList threeDHitList(
118 clusterList, threeDHitList, idToHitMap, pandoraHitToArtHitMap);
125 outputTestBeamInteractionVertices);
130 pandoraHitToArtHitMap,
132 outputSpacePointsToHits);
138 pandoraHitToArtHitMap,
141 outputClustersToHits,
142 pfoToArtClustersMap);
151 outputParticlesToVertices,
152 outputParticlesToSpacePoints,
153 outputParticlesToClusters);
156 evt, instanceLabel, pfoVector, outputParticleMetadata, outputParticlesToMetadata);
166 outputParticlesToSlices,
176 pfoToTestBeamInteractionVerticesMap,
177 outputParticlesToTestBeamInteractionVertices);
180 evt.
put(std::move(outputParticles), instanceLabel);
181 evt.
put(std::move(outputSpacePoints), instanceLabel);
182 evt.
put(std::move(outputClusters), instanceLabel);
183 evt.
put(std::move(outputVertices), instanceLabel);
184 evt.
put(std::move(outputParticleMetadata), instanceLabel);
186 evt.
put(std::move(outputParticlesToMetadata), instanceLabel);
187 evt.
put(std::move(outputParticlesToSpacePoints), instanceLabel);
188 evt.
put(std::move(outputParticlesToClusters), instanceLabel);
189 evt.
put(std::move(outputParticlesToVertices), instanceLabel);
190 evt.
put(std::move(outputParticlesToSlices), instanceLabel);
191 evt.
put(std::move(outputSpacePointsToHits), instanceLabel);
192 evt.
put(std::move(outputClustersToHits), instanceLabel);
195 evt.
put(std::move(outputTestBeamInteractionVertices), testBeamInteractionVertexInstanceLabel);
196 evt.
put(std::move(outputParticlesToTestBeamInteractionVertices),
197 testBeamInteractionVertexInstanceLabel);
201 evt.
put(std::move(outputT0s), instanceLabel);
202 evt.
put(std::move(outputParticlesToT0s), instanceLabel);
206 evt.
put(std::move(outputSlices), instanceLabel);
207 evt.
put(std::move(outputSlicesToHits), instanceLabel);
214 const std::string& name,
215 const pandora::Pandora*& pPandoraInstance)
217 if (!pPrimaryPandora)
218 throw cet::exception(
"LArPandora") <<
" LArPandoraOutput::GetPandoraInstance--- input " 219 "primary pandora instance address is invalid ";
221 if (pPandoraInstance)
222 throw cet::exception(
"LArPandora") <<
" LArPandoraOutput::GetPandoraInstance--- the input " 223 "pandora instance address is non-null ";
225 for (
const pandora::Pandora*
const pPandora :
227 if (pPandora->GetName() != name)
continue;
229 if (pPandoraInstance)
231 <<
" LArPandoraOutput::GetPandoraInstance--- found multiple pandora instances with name: " 234 pPandoraInstance = pPandora;
237 return static_cast<bool>(pPandoraInstance);
243 pandora::PfoVector& slicePfos)
245 if (!slicePfos.empty())
247 <<
" LArPandoraOutput::GetPandoraSlices--- Input slicePfo vector is not empty ";
250 const pandora::Pandora* pSlicingWorker(
nullptr);
255 const pandora::PfoList* pSlicePfoList(
nullptr);
256 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
258 PandoraApi::GetCurrentPfoList(*pSlicingWorker, pSlicePfoList));
260 slicePfos.insert(slicePfos.end(), pSlicePfoList->begin(), pSlicePfoList->end());
266 const pandora::Pandora*
const pPrimaryPandora)
268 pandora::PfoList collectedPfos;
271 pandora::PfoVector slicePfos;
275 const pandora::Pandora* pSliceNuWorker(
nullptr);
278 <<
" LArPandoraOutput::CollectAllPfoOutcomes--- Can't find slice nu worker instance. ";
280 const pandora::Pandora* pSliceCRWorker(
nullptr);
283 <<
" LArPandoraOutput::CollectAllPfoOutcomes--- Can't find slice CR worker instance. ";
286 for (
unsigned int sliceIndex = 0; sliceIndex < slicePfos.size(); ++sliceIndex) {
287 const pandora::PfoList* pNuPfoList(
nullptr);
288 if (pandora::STATUS_CODE_SUCCESS ==
289 PandoraApi::GetPfoList(
290 *pSliceNuWorker,
"NeutrinoParticles3D" +
std::to_string(sliceIndex), pNuPfoList))
291 collectedPfos.insert(collectedPfos.end(), pNuPfoList->begin(), pNuPfoList->end());
293 const pandora::PfoList* pCRPfoList(
nullptr);
294 if (pandora::STATUS_CODE_SUCCESS ==
295 PandoraApi::GetPfoList(
296 *pSliceCRWorker,
"MuonParticles3D" +
std::to_string(sliceIndex), pCRPfoList))
297 collectedPfos.insert(collectedPfos.end(), pCRPfoList->begin(), pCRPfoList->end());
301 const pandora::PfoList* pParentPfoList(
nullptr);
302 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
304 PandoraApi::GetCurrentPfoList(*pPrimaryPandora, pParentPfoList));
307 for (
const pandora::ParticleFlowObject*
const pPfo : *pParentPfoList) {
312 pandora::PfoVector pfoVector;
324 const auto& properties(pParent->GetPropertiesMap());
325 const auto it(properties.find(
"IsClearCosmic"));
327 if (it == properties.end())
return false;
329 return static_cast<bool>(std::round(it->second));
338 const auto& properties(pParent->GetPropertiesMap());
339 return (properties.find(
"SliceIndex") != properties.end());
348 const auto& properties(pParent->GetPropertiesMap());
349 const auto it(properties.find(
"SliceIndex"));
351 if (it == properties.end())
353 <<
" LArPandoraOutput::GetSliceIndex--- Input PFO was not from a slice ";
355 return static_cast<unsigned int>(std::round(it->second));
362 const pandora::PfoList* pParentPfoList(
nullptr);
363 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
365 PandoraApi::GetCurrentPfoList(*pPrimaryPandora, pParentPfoList));
367 pandora::PfoVector pfoVector;
376 pandora::PfoVector& pfoVector)
378 if (!pfoVector.empty())
380 <<
" LArPandoraOutput::CollectPfos--- trying to collect pfos into a non-empty list ";
382 pandora::PfoList pfoList;
385 pfoVector.insert(pfoVector.end(), pfoList.begin(), pfoList.end());
392 const pandora::PfoVector& pfoVector,
394 std::function<
const pandora::Vertex*
const(
const pandora::ParticleFlowObject*
const)> fCriteria)
398 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
399 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
401 if (pPfo->GetVertexList().empty())
continue;
407 const auto it(std::find(vertexVector.begin(), vertexVector.end(), pVertex));
408 const bool isInList(it != vertexVector.end());
409 const size_t vertexId(isInList ? std::distance(vertexVector.begin(), it) :
410 vertexVector.size());
412 if (!isInList) vertexVector.push_back(pVertex);
414 if (!pfoToVerticesMap.insert(IdToIdVectorMap::value_type(pfoId, {vertexId})).second)
416 <<
" LArPandoraOutput::CollectVertices --- repeated pfos in input list ";
418 catch (
const pandora::StatusCodeException&) {
431 pandora::ClusterList clusterList;
433 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
434 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
437 pandora::ClusterList clusters;
442 IdVector clusterIds(clusters.size());
443 std::iota(clusterIds.begin(), clusterIds.end(), clusterList.size());
445 clusterList.insert(clusterList.end(), clusters.begin(), clusters.end());
447 if (!pfoToClustersMap.insert(IdToIdVectorMap::value_type(pfoId, clusterIds)).second)
449 <<
" LArPandoraOutput::CollectClusters --- repeated pfos in input list ";
460 pandora::CaloHitList caloHitList;
462 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
463 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
465 if (!pfoToThreeDHitsMap.insert(IdToIdVectorMap::value_type(pfoId, {})).second)
467 <<
" LArPandoraOutput::Collect3DHits --- repeated pfos in input list ";
469 pandora::CaloHitVector sorted3DHits;
472 for (
const pandora::CaloHit*
const pCaloHit3D : sorted3DHits) {
473 if (pandora::TPC_3D !=
477 <<
" LArPandoraOutput::Collect3DHits --- found a 2D hit in a 3D cluster";
479 pfoToThreeDHitsMap.at(pfoId).push_back(caloHitList.size());
480 caloHitList.push_back(pCaloHit3D);
490 pandora::CaloHitVector& caloHits)
493 pandora::CaloHitList threeDHits;
496 caloHits.insert(caloHits.end(), threeDHits.begin(), threeDHits.end());
503 const pandora::CaloHitList& threeDHitList,
508 for (
const pandora::Cluster*
const pCluster : clusterList) {
511 <<
" LArPandoraOutput::GetPandoraToArtHitMap --- found a 3D input cluster ";
513 pandora::CaloHitVector sortedHits;
516 for (
const pandora::CaloHit*
const pCaloHit : sortedHits) {
517 if (!pandoraHitToArtHitMap
518 .insert(CaloHitToArtHitMap::value_type(
522 <<
" LArPandoraOutput::GetPandoraToArtHitMap --- found repeated input hits ";
526 for (
const pandora::CaloHit*
const pCaloHit : threeDHitList) {
527 if (pCaloHit->GetHitType() != pandora::TPC_3D)
529 <<
" LArPandoraOutput::GetPandoraToArtHitMap --- found a non-3D hit in the input list ";
532 if (!pandoraHitToArtHitMap
533 .insert(CaloHitToArtHitMap::value_type(
536 idToHitMap, static_cast<const pandora::CaloHit*>(pCaloHit->GetParentAddress()))))
539 <<
" LArPandoraOutput::GetPandoraToArtHitMap --- found repeated input hits ";
546 const pandora::CaloHit*
const pCaloHit)
552 for (
unsigned int depth = 0, maxDepth = 2; depth < maxDepth; ++depth) {
554 const pandora::CaloHit* pParentCaloHit = pCaloHit;
555 for (
unsigned int i = 0; i < depth; ++i)
556 pParentCaloHit = static_cast<const pandora::CaloHit*>(pCaloHit->GetParentAddress());
559 const void*
const pHitAddress(pParentCaloHit->GetParentAddress());
560 const intptr_t hitID_temp((intptr_t)(pHitAddress));
561 const int hitID((
int)(hitID_temp));
566 if (idToHitMap.end() == artIter)
continue;
568 return artIter->second;
572 <<
" LArPandoraOutput::GetHit --- found a Pandora hit without a parent ART hit ";
580 for (
size_t vertexId = 0; vertexId < vertexVector.size(); ++vertexId)
587 const std::string& instanceLabel,
588 const pandora::CaloHitList& threeDHitList,
593 pandora::CaloHitVector threeDHitVector;
594 threeDHitVector.insert(threeDHitVector.end(), threeDHitList.begin(), threeDHitList.end());
596 for (
unsigned int hitId = 0; hitId < threeDHitVector.size(); hitId++) {
597 const pandora::CaloHit*
const pCaloHit(threeDHitVector.at(hitId));
600 if (it == pandoraHitToArtHitMap.end())
601 throw cet::exception(
"LArPandora") <<
" LArPandoraOutput::BuildSpacePoints --- found a " 602 "pandora hit without a corresponding art hit ";
605 event, instanceLabel, hitId, {it->second}, outputSpacePointsToHits);
613 const std::string& instanceLabel,
614 const pandora::ClusterList& clusterList,
624 auto const clock_data =
626 auto const det_prop =
631 size_t nextClusterId(0);
633 for (
const pandora::Cluster*
const pCluster : clusterList) {
634 std::vector<HitVector> hitVectors;
635 const std::vector<recob::Cluster> clusters(
639 pandoraHitToArtHitMap,
640 pandoraClusterToArtClustersMap,
645 if (hitVectors.size() != clusters.size())
647 <<
" LArPandoraOutput::BuildClusters --- invalid hit vectors for clusters produced ";
649 for (
unsigned int i = 0; i < clusters.size(); ++i) {
651 event, instanceLabel, nextClusterId - 1, hitVectors.at(i), outputClustersToHits);
652 outputClusters->push_back(clusters.at(i));
658 it != pfoToClustersMap.end();
660 if (!pfoToArtClustersMap.insert(IdToIdVectorMap::value_type(it->first, {})).second)
662 <<
" LArPandoraOutput::BuildClusters --- repeated pfo ids ";
664 for (
const size_t pandoraClusterId : it->second) {
667 if (it2 == pandoraClusterToArtClustersMap.end())
668 throw cet::exception(
"LArPandora") <<
" LArPandoraOutput::BuildClusters --- found a " 669 "pandora cluster with no associated recob cluster ";
671 for (
const size_t recobClusterId : it2->second)
672 pfoToArtClustersMap.at(it->first).push_back(recobClusterId);
681 const std::string& instanceLabel,
682 const pandora::PfoVector& pfoVector,
691 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
692 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
697 if (pfoToVerticesMap.find(pfoId) != pfoToVerticesMap.end())
699 event, instanceLabel, pfoId, pfoToVerticesMap, outputParticlesToVertices);
701 if (pfoToThreeDHitsMap.find(pfoId) != pfoToThreeDHitsMap.end())
703 event, instanceLabel, pfoId, pfoToThreeDHitsMap, outputParticlesToSpacePoints);
705 if (pfoToArtClustersMap.find(pfoId) != pfoToArtClustersMap.end())
707 event, instanceLabel, pfoId, pfoToArtClustersMap, outputParticlesToClusters);
715 const std::string& instanceLabel,
716 const pandora::PfoVector& pfoVector,
720 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
721 if (pfoToVerticesMap.find(pfoId) != pfoToVerticesMap.end())
723 event, instanceLabel, pfoId, pfoToVerticesMap, outputParticlesToVertices);
731 const std::string& instanceLabel,
732 const pandora::PfoVector& pfoVector,
736 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
737 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
740 event, instanceLabel, pfoId, outputParticleMetadata->size(), outputParticlesToMetadata);
743 outputParticleMetadata->push_back(pPFParticleMetadata);
750 const pandora::Pandora*
const pPrimaryPandora,
752 const std::string& instanceLabel,
753 const pandora::PfoVector& pfoVector,
767 outputParticlesToSlices,
773 pandora::PfoVector slicePfos;
777 for (
const pandora::ParticleFlowObject*
const pSlicePfo : slicePfos)
779 pSlicePfo, event, instanceLabel, idToHitMap, outputSlices, outputSlicesToHits);
782 std::unordered_map<const pandora::ParticleFlowObject*, unsigned int> parentPfoToSliceIndexMap;
783 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
784 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
791 if (!parentPfoToSliceIndexMap
794 pPfo, event, instanceLabel, idToHitMap, outputSlices, outputSlicesToHits))
797 <<
" LArPandoraOutput::BuildSlices --- found repeated primary particles ";
801 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
802 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
810 outputParticlesToSlices);
815 const pandora::ParticleFlowObject*
const pParent(
817 if (parentPfoToSliceIndexMap.find(pParent) == parentPfoToSliceIndexMap.end())
819 <<
" LArPandoraOutput::BuildSlices --- found pfo without a parent in the input list ";
823 event, instanceLabel, pfoId, parentPfoToSliceIndexMap.at(pParent), outputParticlesToSlices);
832 const float bogusFloat(std::numeric_limits<float>::max());
836 const unsigned int sliceIndex(outputSlices->size());
837 outputSlices->emplace_back(
838 sliceIndex, bogusPoint, bogusVector, bogusPoint, bogusPoint, bogusFloat, bogusFloat);
848 const std::string& instanceLabel,
849 const pandora::PfoVector& pfoVector,
864 mf::LogDebug(
"LArPandora") <<
" - Found " << hits.size() << std::endl;
865 mf::LogDebug(
"LArPandora") <<
" - Making associations " << outputSlicesToHits->size()
869 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId)
871 event, instanceLabel, pfoId, sliceIndex, outputParticlesToSlices);
878 const std::string& instanceLabel,
886 pandora::PfoList pfosInSlice;
891 pandora::CaloHitList
hits;
892 for (
const pandora::ParticleFlowObject*
const pPfo : pfosInSlice) {
894 {pandora::TPC_VIEW_U, pandora::TPC_VIEW_V, pandora::TPC_VIEW_W}) {
901 for (
const pandora::CaloHit*
const pCaloHit : hits)
914 const std::string& instanceLabel,
915 const pandora::PfoVector& pfoVector,
920 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
921 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
927 event, instanceLabel, pfoId, nextT0Id - 1, outputParticlesToT0s);
928 outputT0s->push_back(t0);
936 const pandora::PfoVector& pfoVector)
939 const pandora::PfoList& parentList(pPfo->GetParentPfoList());
940 if (parentList.size() > 1)
942 <<
" LArPandoraOutput::BuildPFParticle --- this pfo has multiple parent particles ";
944 const size_t parentId(parentList.empty() ?
949 std::vector<size_t> daughterIds;
950 for (
const pandora::ParticleFlowObject*
const pDaughterPfo : pPfo->GetDaughterPfoList())
953 std::sort(daughterIds.begin(), daughterIds.end());
961 const size_t vertexId)
964 pVertex->GetPosition().GetX(), pVertex->GetPosition().GetY(), pVertex->GetPosition().GetZ()};
971 pandora::CaloHitVector& sortedHits)
973 if (!sortedHits.empty())
975 <<
" LArPandoraOutput::GetHitsInCluster --- vector to hold hits is not empty ";
977 pandora::CaloHitList hitList;
978 pCluster->GetOrderedCaloHitList().FillCaloHitList(hitList);
979 hitList.insert(hitList.end(),
980 pCluster->GetIsolatedCaloHitList().begin(),
981 pCluster->GetIsolatedCaloHitList().end());
983 sortedHits.insert(sortedHits.end(), hitList.begin(), hitList.end());
992 const pandora::Cluster*
const pCluster,
993 const pandora::ClusterList& clusterList,
996 std::vector<HitVector>& hitVectors,
1000 std::vector<recob::Cluster> clusters;
1004 if (!pandoraClusterToArtClustersMap.insert(IdToIdVectorMap::value_type(clusterId, {})).second)
1006 <<
" LArPandoraOutput::BuildClusters --- repeated clusters in input list ";
1008 pandora::CaloHitVector sortedHits;
1014 for (
const pandora::CaloHit*
const pCaloHit2D : sortedHits) {
1016 if (it == pandoraHitToArtHitMap.end())
1018 <<
" LArPandoraOutput::BuildClusters --- couldn't find art hit for input pandora hit ";
1023 const unsigned int volID(100000 * wireID.Cryostat + wireID.TPC);
1024 hitArray[volID].push_back(hit);
1026 if (pCaloHit2D->IsIsolated()) isolatedHits.insert(hit);
1029 if (hitArray.empty())
1031 <<
" LArPandoraOutput::BuildClusters --- found a cluster with no hits ";
1033 for (
const HitArray::value_type& hitArrayEntry : hitArray) {
1034 const HitVector& clusterHits(hitArrayEntry.second);
1038 hitVectors.push_back(clusterHits);
1039 pandoraClusterToArtClustersMap.at(clusterId).push_back(nextId);
1055 if (hitVector.empty())
1057 <<
" LArPandoraOutput::BuildCluster --- No input hits were provided ";
1063 double startWire(+std::numeric_limits<float>::max()), sigmaStartWire(0.0);
1064 double startTime(+std::numeric_limits<float>::max()), sigmaStartTime(0.0);
1065 double endWire(-std::numeric_limits<float>::max()), sigmaEndWire(0.0);
1066 double endTime(-std::numeric_limits<float>::max()), sigmaEndTime(0.0);
1068 std::vector<recob::Hit const*> hits_for_params;
1069 hits_for_params.reserve(hitVector.size());
1072 const double thisWire(
hit->WireID().Wire);
1073 const double thisWireSigma(0.5);
1074 const double thisTime(
hit->PeakTime());
1075 const double thisTimeSigma(
double(2. *
hit->RMS()));
1081 planeID = thisPlaneID;
1084 if (!(thisView == view && thisPlaneID == planeID)) {
1086 <<
" LArPandoraOutput::BuildCluster --- Input hits have inconsistent plane IDs ";
1089 hits_for_params.push_back(&*
hit);
1091 if (isolatedHits.count(
hit))
continue;
1093 if (thisWire < startWire || (thisWire == startWire && thisTime < startTime)) {
1094 startWire = thisWire;
1095 sigmaStartWire = thisWireSigma;
1096 startTime = thisTime;
1097 sigmaStartTime = thisTimeSigma;
1100 if (thisWire > endWire || (thisWire == endWire && thisTime > endTime)) {
1102 sigmaEndWire = thisWireSigma;
1104 sigmaEndTime = thisTimeSigma;
1133 const size_t spacePointId)
1135 if (pandora::TPC_3D != pCaloHit->GetHitType())
1137 <<
" LArPandoraOutput::BuildSpacePoint --- trying to build a space point from a 2D hit";
1139 const pandora::CartesianVector point(pCaloHit->GetPositionVector());
1140 double xyz[3] = {point.GetX(), point.GetY(), point.GetZ()};
1143 double dxdydz[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
1152 const pandora::ParticleFlowObject*
const pPfo,
1153 const pandora::PfoVector& pfoVector,
1158 const float x0(pParent->GetPropertiesMap().count(
"X0") ? pParent->GetPropertiesMap().at(
"X0") :
1162 auto const det_prop =
1164 const double cm_per_tick(det_prop.GetXTicksCoefficient());
1168 const double T0(x0 * ns_per_tick / cm_per_tick);
1170 if (std::fabs(T0) <= std::numeric_limits<double>::epsilon())
return false;
1182 : m_pPrimaryPandora(nullptr)
1183 , m_shouldRunStitching(false)
1184 , m_shouldProduceAllOutcomes(false)
1185 , m_shouldProduceTestBeamInteractionVertices(false)
1186 , m_isNeutrinoRecoOnlyNoSlicing(false)
1195 <<
" LArPandoraOutput::Settings::Validate --- primary Pandora instance does not exist ";
1201 <<
" LArPandoraOutput::Settings::Validate --- all outcomes instance label not set ";
code to link reconstructed objects back to the MC truth information
std::map< int, art::Ptr< recob::Hit > > IdToHitMap
static bool SortByNHits(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by number of hits, then layer span, then inner layer, then position, then pulse-height.
static pandora::VertexVector CollectVertices(const pandora::PfoVector &pfoVector, IdToIdVectorMap &pfoToVerticesMap, std::function< const pandora::Vertex *const (const pandora::ParticleFlowObject *const)> fCriteria)
Collect all vertices contained in the input pfo list Order is guaranteed provided pfoVector is ordere...
static recob::SpacePoint BuildSpacePoint(const pandora::CaloHit *const pCaloHit, const size_t spacePointId)
Convert from a pandora 3D hit to an ART spacepoint.
void Validate() const
Check the parameters and throw an exception if they are not valid.
static void GetPandoraSlices(const pandora::Pandora *const pPrimaryPandora, pandora::PfoVector &slicePfos)
Get the slice pfos - one pfo per slice.
static bool SortByNHits(const pandora::ParticleFlowObject *const pLhs, const pandora::ParticleFlowObject *const pRhs)
Sort pfos by number of constituent hits.
Header file for the pfo helper class.
static recob::Cluster BuildCluster(util::GeometryUtilities const &gser, const size_t id, const HitVector &hitVector, const HitList &isolatedHits, cluster::ClusterParamsAlgBase &algo)
Build an ART cluster from an input vector of ART hits.
Class managing the creation of a new recob::Cluster object.
const pandora::Pandora * m_pPrimaryPandora
static bool GetPandoraInstance(const pandora::Pandora *const pPrimaryPandora, const std::string &name, const pandora::Pandora *&pPandoraInstance)
Get the address of a pandora instance with a given name.
std::unique_ptr< std::vector< larpandoraobj::PFParticleMetadata > > PFParticleMetadataCollection
static void GetPandoraToArtHitMap(const pandora::ClusterList &clusterList, const pandora::CaloHitList &threeDHitList, const IdToHitMap &idToHitMap, CaloHitToArtHitMap &pandoraHitToArtHitMap)
Collect all 2D and 3D hits that were used / produced in the reconstruction and map them to their corr...
static constexpr size_t kPFParticlePrimary
Define index to signify primary particle.
enum geo::_plane_proj View_t
Enumerate the possible plane projections.
std::map< int, HitVector > HitArray
static void GetTwoDClusterList(const pandora::ParticleFlowObject *const pPfo, pandora::ClusterList &clusterList)
Get the list of 2D clusters from an input pfo.
std::unique_ptr< art::Assns< recob::PFParticle, recob::Slice > > PFParticleToSliceCollection
static void BuildClusters(const art::Event &event, const std::string &instanceLabel, const pandora::ClusterList &clusterList, const CaloHitToArtHitMap &pandoraHitToArtHitMap, const IdToIdVectorMap &pfoToClustersMap, ClusterCollection &outputClusters, ClusterToHitCollection &outputClustersToHits, IdToIdVectorMap &pfoToArtClustersMap)
Convert pandora 2D clusters to ART clusters and add them to the output vector Create the associations...
static void BuildSpacePoints(const art::Event &event, const std::string &instanceLabel, const pandora::CaloHitList &threeDHitList, const CaloHitToArtHitMap &pandoraHitToArtHitMap, SpacePointCollection &outputSpacePoints, SpacePointToHitCollection &outputSpacePointsToHits)
Convert pandora 3D hits to ART spacepoints and add them to the output vector Create the associations ...
Declaration of signal hit object.
static unsigned int BuildSlice(const pandora::ParticleFlowObject *const pParentPfo, const art::Event &event, const std::string &instanceLabel, const IdToHitMap &idToHitMap, SliceCollection &outputSlices, SliceToHitCollection &outputSlicesToHits)
Build a new slice object from a PFO, this can be a top-level parent in a hierarchy or a "slice PFO" f...
std::unique_ptr< std::vector< recob::Slice > > SliceCollection
static const pandora::Vertex * GetVertex(const pandora::ParticleFlowObject *const pPfo)
Get the pfo vertex.
std::unique_ptr< std::vector< recob::PFParticle > > PFParticleCollection
The data type to uniquely identify a Plane.
static unsigned int BuildDummySlice(SliceCollection &outputSlices)
Build a new slice object with dummy information.
Settings()
Default constructor.
std::string m_testBeamInteractionVerticesInstanceLabel
The label for the test beam interaction vertices.
std::unique_ptr< std::vector< recob::Vertex > > VertexCollection
static const pandora::Vertex * GetTestBeamInteractionVertex(const pandora::ParticleFlowObject *const pPfo)
Get the pfo test beam interaction vertex.
std::string m_allOutcomesInstanceLabel
The label for the instance producing all outcomes.
std::map< size_t, IdVector > IdToIdVectorMap
Algorithm collection class computing cluster parameters.
static void GetHitsInCluster(const pandora::Cluster *const pCluster, pandora::CaloHitVector &sortedHits)
Collect a sorted list of all 2D hits in a cluster.
Set of hits with a 2D structure.
std::unique_ptr< art::Assns< recob::PFParticle, larpandoraobj::PFParticleMetadata > > PFParticleToMetadataCollection
static art::Ptr< recob::Hit > GetHit(const IdToHitMap &idToHitMap, const pandora::CaloHit *const pCaloHit)
Look up ART hit from an input Pandora hit.
geo::WireID const & WireID() const
Initial tdc tick for hit.
bool m_isNeutrinoRecoOnlyNoSlicing
If we are running the neutrino reconstruction only with no slicing.
static size_t GetId(const T *const pT, const std::list< const T * > &tList)
Find the index of an input object in an input list. Throw an exception if it doesn't exist...
Helper functions for processing outputs from pandora.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
static bool IsFromSlice(const pandora::ParticleFlowObject *const pPfo)
Check if the input pfo is from a slice.
virtual void SetHitsFromPointers(util::GeometryUtilities const &gser, std::vector< recob::Hit const * > const &hits)=0
Sets the list of input hits.
Definition of vertex object for LArSoft.
static recob::Vertex BuildVertex(const pandora::Vertex *const pVertex, const size_t vertexId)
Convert from a pandora vertex to an ART vertex.
static const SentryArgument_t Sentry
An instance of the sentry object.
std::unique_ptr< art::Assns< recob::PFParticle, recob::Cluster > > PFParticleToClusterCollection
static void AssociateAdditionalVertices(const art::Event &event, const std::string &instanceLabel, const pandora::PfoVector &pfoVector, const IdToIdVectorMap &pfoToVerticesMap, PFParticleToVertexCollection &outputParticlesToVertices)
Convert Create the associations between pre-existing PFParticle and additional vertices.
std::string m_hitfinderModuleLabel
The hit finder module label.
Algorithm collection class computing cluster parameters.
std::unique_ptr< art::Assns< recob::Slice, recob::Hit > > SliceToHitCollection
PutHandle< PROD > put(std::unique_ptr< PROD > &&edp, std::string const &instance={})
std::vector< size_t > IdVector
Metadata associated to PFParticles.
decltype(auto) constexpr to_string(T &&obj)
ADL-aware version of std::to_string.
static bool SortHitsByPosition(const pandora::CaloHit *const pLhs, const pandora::CaloHit *const pRhs)
Sort calo hits by their position (use Z, followed by X, followed by Y)
static const pandora::ParticleFlowObject * GetParentPfo(const pandora::ParticleFlowObject *const pPfo)
Get the primary parent pfo.
Header file for the cluster helper class.
static unsigned int GetSliceIndex(const pandora::ParticleFlowObject *const pPfo)
Get the index of the slice from which this pfo was produced.
std::unique_ptr< art::Assns< recob::PFParticle, anab::T0 > > PFParticleToT0Collection
Helper functions to create a cluster.
static void BuildVertices(const pandora::VertexVector &vertexVector, VertexCollection &outputVertices)
Convert pandora vertices to ART vertices and add them to the output vector.
static bool BuildT0(const art::Event &event, const pandora::ParticleFlowObject *const pPfo, const pandora::PfoVector &pfoVector, size_t &nextId, anab::T0 &t0)
If required, build a T0 for the input pfo.
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< Coord_t >, ROOT::Math::GlobalCoordinateSystemTag > Vector_t
Type for representation of momenta in 3D space. See recob::tracking::Coord_t for more details on the ...
std::unique_ptr< art::Assns< recob::SpacePoint, recob::Hit > > SpacePointToHitCollection
static pandora::PfoVector CollectPfos(const pandora::Pandora *const pPrimaryPandora)
Collect the current pfos (including all downstream pfos) from the master pandora instance.
static bool IsClearCosmic(const pandora::ParticleFlowObject *const pPfo)
Check if the input pfo is an unambiguous cosmic ray.
Wrapper for ClusterParamsAlgBase objects to accept arbitrary input.
static void ProduceArtOutput(const Settings &settings, const IdToHitMap &idToHitMap, art::Event &evt)
Convert the Pandora PFOs into ART clusters and write into ART event.
std::unique_ptr< std::vector< recob::Cluster > > ClusterCollection
std::map< const pandora::CaloHit *, art::Ptr< recob::Hit > > CaloHitToArtHitMap
std::unique_ptr< art::Assns< recob::PFParticle, recob::Vertex > > PFParticleToVertexCollection
Header file for the MultiPandoraApi class.
static const PandoraInstanceList & GetDaughterPandoraInstanceList(const pandora::Pandora *const pPrimaryPandora)
Get the list of daughter pandora instances associated with a given primary pandora instance...
static pandora::ClusterList CollectClusters(const pandora::PfoVector &pfoVector, IdToIdVectorMap &pfoToClustersMap)
Collect a sorted list of all 2D clusters contained in the input pfo list Order is guaranteed provided...
static void Collect3DHits(const pandora::ParticleFlowObject *const pPfo, pandora::CaloHitVector &caloHits)
Collect a sorted vector of all 3D hits in the input pfo.
static void BuildT0s(const art::Event &event, const std::string &instanceLabel, const pandora::PfoVector &pfoVector, T0Collection &outputT0s, PFParticleToT0Collection &outputParticlesToT0s)
Calculate the T0 of each pfos and add them to the output vector Create the associations between PFPar...
bool m_shouldProduceTestBeamInteractionVertices
Whether to write the test beam interaction vertices in a separate collection.
static void CollectHits(const art::Event &evt, const std::string &label, HitVector &hitVector)
Collect the reconstructed Hits from the ART event record.
Detector simulation of raw signals on wires.
static recob::PFParticle BuildPFParticle(const pandora::ParticleFlowObject *const pPfo, const size_t pfoId, const pandora::PfoVector &pfoVector)
Convert from a pfo to and ART PFParticle.
std::unique_ptr< art::Assns< recob::PFParticle, recob::SpacePoint > > PFParticleToSpacePointCollection
std::vector< art::Ptr< recob::Hit > > HitVector
Hierarchical representation of particle flow.
Utility object to perform functions of association.
bool m_shouldRunStitching
std::unique_ptr< std::vector< anab::T0 > > T0Collection
bool m_shouldProduceAllOutcomes
If all outcomes should be produced in separate collections (choose false if you only require the cons...
bool m_shouldProduceSlices
Whether to produce output slices e.g. may not want to do this if only (re)processing single slices...
static void GetIsolatedCaloHits(const pandora::PfoList &pfoList, const pandora::HitType &hitType, pandora::CaloHitList &caloHitList)
Get a list of isolated calo hits of a particular hit type from a list of pfos.
MaybeLogger_< ELseverityLevel::ELsev_success, false > LogDebug
static void BuildSlices(const Settings &settings, const pandora::Pandora *const pPrimaryPandora, const art::Event &event, const std::string &instanceLabel, const pandora::PfoVector &pfoVector, const IdToHitMap &idToHitMap, SliceCollection &outputSlices, PFParticleToSliceCollection &outputParticlesToSlices, SliceToHitCollection &outputSlicesToHits)
Build slices - collections of hits which each describe a single particle hierarchy.
static void CopyAllHitsToSingleSlice(const Settings &settings, const art::Event &event, const std::string &instanceLabel, const pandora::PfoVector &pfoVector, const IdToHitMap &idToHitMap, SliceCollection &outputSlices, PFParticleToSliceCollection &outputParticlesToSlices, SliceToHitCollection &outputSlicesToHits)
Ouput a single slice containing all of the input hits.
std::vector< art::Ptr< recob::Vertex > > VertexVector
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
static void BuildPFParticles(const art::Event &event, const std::string &instanceLabel, const pandora::PfoVector &pfoVector, const IdToIdVectorMap &pfoToVerticesMap, const IdToIdVectorMap &pfoToThreeDHitsMap, const IdToIdVectorMap &pfoToArtClustersMap, PFParticleCollection &outputParticles, PFParticleToVertexCollection &outputParticlesToVertices, PFParticleToSpacePointCollection &outputParticlesToSpacePoints, PFParticleToClusterCollection &outputParticlesToClusters)
Convert between pfos and PFParticles and add them to the output vector Create the associations betwee...
static void BuildParticleMetadata(const art::Event &event, const std::string &instanceLabel, const pandora::PfoVector &pfoVector, PFParticleMetadataCollection &outputParticleMetadata, PFParticleToMetadataCollection &outputParticlesToMetadata)
Build metadata objects from a list of input pfos.
std::unique_ptr< std::vector< recob::SpacePoint > > SpacePointCollection
Interface to class computing cluster parameters.
static void GetAllConnectedPfos(const pandora::PfoList &inputPfoList, pandora::PfoList &outputPfoList)
Get a flat list of all pfos, recursively including all daughters and parents associated with those pf...
second_as<> second
Type of time stored in seconds, in double precision.
double sampling_rate(DetectorClocksData const &data)
Returns the period of the TPC readout electronics clock.
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< Coord_t >, ROOT::Math::GlobalCoordinateSystemTag > Point_t
Type for representation of position in physical 3D space. See recob::tracking::Coord_t for more detai...
static void GetCaloHits(const pandora::PfoList &pfoList, const pandora::HitType &hitType, pandora::CaloHitList &caloHitList)
Get a list of calo hits of a particular hit type from a list of pfos.
std::set< art::Ptr< recob::Hit > > HitList
recob::Cluster && move()
Prepares the constructed hit to be moved away.
static pandora::PfoVector CollectAllPfoOutcomes(const pandora::Pandora *const pPrimaryPandora)
Collect the pfos (including all downstream pfos) from the master and daughter pandora instances...
static void AddAssociation(const art::Event &event, const std::string &instanceLabel, const size_t idA, const size_t idB, std::unique_ptr< art::Assns< A, B >> &association)
Add an association between objects with two given ids.
std::unique_ptr< art::Assns< recob::Cluster, recob::Hit > > ClusterToHitCollection
art framework interface to geometry description
cet::coded_exception< error, detail::translate > exception
static larpandoraobj::PFParticleMetadata GetPFParticleMetadata(const pandora::ParticleFlowObject *const pPfo)
Get metadata associated to a PFO.
Event finding and building.