7 #include "cetlib_except/exception.h" 28 #include "Api/PandoraApi.h" 30 #include "Objects/CaloHit.h" 31 #include "Objects/Cluster.h" 32 #include "Objects/ParticleFlowObject.h" 33 #include "Objects/Vertex.h" 57 const std::string testBeamInteractionVertexInstanceLabel(
66 new std::vector<larpandoraobj::PFParticleMetadata>);
101 const pandora::PfoVector pfoVector(
112 pfoToTestBeamInteractionVerticesMap,
117 const pandora::ClusterList clusterList(
121 const pandora::CaloHitList threeDHitList(
127 clusterList, threeDHitList, idToHitMap, pandoraHitToArtHitMap);
134 outputTestBeamInteractionVertices);
139 pandoraHitToArtHitMap,
141 outputSpacePointsToHits);
147 pandoraHitToArtHitMap,
150 outputClustersToHits,
151 pfoToArtClustersMap);
160 outputParticlesToVertices,
161 outputParticlesToSpacePoints,
162 outputParticlesToClusters);
165 evt, instanceLabel, pfoVector, outputParticleMetadata, outputParticlesToMetadata);
175 outputParticlesToSlices,
185 pfoToTestBeamInteractionVerticesMap,
186 outputParticlesToTestBeamInteractionVertices);
193 evt.
put(
std::move(outputParticleMetadata), instanceLabel);
195 evt.
put(
std::move(outputParticlesToMetadata), instanceLabel);
196 evt.
put(
std::move(outputParticlesToSpacePoints), instanceLabel);
197 evt.
put(
std::move(outputParticlesToClusters), instanceLabel);
198 evt.
put(
std::move(outputParticlesToVertices), instanceLabel);
199 evt.
put(
std::move(outputParticlesToSlices), instanceLabel);
200 evt.
put(
std::move(outputSpacePointsToHits), instanceLabel);
201 evt.
put(
std::move(outputClustersToHits), instanceLabel);
204 evt.
put(
std::move(outputTestBeamInteractionVertices), testBeamInteractionVertexInstanceLabel);
205 evt.
put(
std::move(outputParticlesToTestBeamInteractionVertices),
206 testBeamInteractionVertexInstanceLabel);
211 evt.
put(
std::move(outputParticlesToT0s), instanceLabel);
225 const pandora::Pandora*& pPandoraInstance)
227 if (!pPrimaryPandora)
228 throw cet::exception(
"LArPandora") <<
" LArPandoraOutput::GetPandoraInstance--- input " 229 "primary pandora instance address is invalid ";
231 if (pPandoraInstance)
232 throw cet::exception(
"LArPandora") <<
" LArPandoraOutput::GetPandoraInstance--- the input " 233 "pandora instance address is non-null ";
235 for (
const pandora::Pandora*
const pPandora :
237 if (pPandora->GetName() !=
name)
continue;
239 if (pPandoraInstance)
241 <<
" LArPandoraOutput::GetPandoraInstance--- found multiple pandora instances with name: " 244 pPandoraInstance = pPandora;
247 return static_cast<bool>(pPandoraInstance);
254 pandora::PfoVector& slicePfos)
256 if (!slicePfos.empty())
258 <<
" LArPandoraOutput::GetPandoraSlices--- Input slicePfo vector is not empty ";
261 const pandora::Pandora* pSlicingWorker(
nullptr);
266 const pandora::PfoList* pSlicePfoList(
nullptr);
267 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
269 PandoraApi::GetCurrentPfoList(*pSlicingWorker, pSlicePfoList));
271 slicePfos.insert(slicePfos.end(), pSlicePfoList->begin(), pSlicePfoList->end());
279 pandora::PfoList collectedPfos;
282 pandora::PfoVector slicePfos;
286 const pandora::Pandora* pSliceNuWorker(
nullptr);
289 <<
" LArPandoraOutput::CollectAllPfoOutcomes--- Can't find slice nu worker instance. ";
291 const pandora::Pandora* pSliceCRWorker(
nullptr);
294 <<
" LArPandoraOutput::CollectAllPfoOutcomes--- Can't find slice CR worker instance. ";
297 for (
unsigned int sliceIndex = 0; sliceIndex < slicePfos.size(); ++sliceIndex) {
298 const pandora::PfoList* pNuPfoList(
nullptr);
299 if (pandora::STATUS_CODE_SUCCESS ==
300 PandoraApi::GetPfoList(
301 *pSliceNuWorker,
"NeutrinoParticles3D" +
std::to_string(sliceIndex), pNuPfoList))
302 collectedPfos.insert(collectedPfos.end(), pNuPfoList->begin(), pNuPfoList->end());
304 const pandora::PfoList* pCRPfoList(
nullptr);
305 if (pandora::STATUS_CODE_SUCCESS ==
306 PandoraApi::GetPfoList(
307 *pSliceCRWorker,
"MuonParticles3D" +
std::to_string(sliceIndex), pCRPfoList))
308 collectedPfos.insert(collectedPfos.end(), pCRPfoList->begin(), pCRPfoList->end());
312 const pandora::PfoList* pParentPfoList(
nullptr);
313 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
315 PandoraApi::GetCurrentPfoList(*pPrimaryPandora, pParentPfoList));
318 for (
const pandora::ParticleFlowObject*
const pPfo : *pParentPfoList) {
323 pandora::PfoVector pfoVector;
336 const auto& properties(pParent->GetPropertiesMap());
337 const auto it(properties.find(
"IsClearCosmic"));
339 if (it == properties.end())
return false;
341 return static_cast<bool>(std::round(it->second));
351 const auto& properties(pParent->GetPropertiesMap());
352 return (properties.find(
"SliceIndex") != properties.end());
362 const auto& properties(pParent->GetPropertiesMap());
363 const auto it(properties.find(
"SliceIndex"));
365 if (it == properties.end())
367 <<
" LArPandoraOutput::GetSliceIndex--- Input PFO was not from a slice ";
369 return static_cast<unsigned int>(std::round(it->second));
377 const pandora::PfoList* pParentPfoList(
nullptr);
378 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
380 PandoraApi::GetCurrentPfoList(*pPrimaryPandora, pParentPfoList));
382 pandora::PfoVector pfoVector;
392 pandora::PfoVector& pfoVector)
394 if (!pfoVector.empty())
396 <<
" LArPandoraOutput::CollectPfos--- trying to collect pfos into a non-empty list ";
398 pandora::PfoList pfoList;
401 pfoVector.insert(pfoVector.end(), pfoList.begin(), pfoList.end());
409 const pandora::PfoVector& pfoVector,
415 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
416 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
418 if (pPfo->GetVertexList().empty())
continue;
424 const auto it(std::find(vertexVector.begin(), vertexVector.end(), pVertex));
425 const bool isInList(it != vertexVector.end());
426 const size_t vertexId(isInList ?
std::distance(vertexVector.begin(), it) :
427 vertexVector.size());
429 if (!isInList) vertexVector.push_back(pVertex);
431 if (!pfoToVerticesMap.insert(IdToIdVectorMap::value_type(pfoId, {vertexId})).second)
433 <<
" LArPandoraOutput::CollectVertices --- repeated pfos in input list ";
435 catch (
const pandora::StatusCodeException&) {
449 pandora::ClusterList clusterList;
451 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
452 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
455 pandora::ClusterList clusters;
460 IdVector clusterIds(clusters.size());
461 std::iota(clusterIds.begin(), clusterIds.end(), clusterList.size());
463 clusterList.insert(clusterList.end(), clusters.begin(), clusters.end());
465 if (!pfoToClustersMap.insert(IdToIdVectorMap::value_type(pfoId, clusterIds)).second)
467 <<
" LArPandoraOutput::CollectClusters --- repeated pfos in input list ";
479 pandora::CaloHitList caloHitList;
481 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
482 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
484 if (!pfoToThreeDHitsMap.insert(IdToIdVectorMap::value_type(pfoId, {})).second)
486 <<
" LArPandoraOutput::Collect3DHits --- repeated pfos in input list ";
488 pandora::CaloHitVector sorted3DHits;
491 for (
const pandora::CaloHit*
const pCaloHit3D : sorted3DHits) {
492 if (pandora::TPC_3D !=
496 <<
" LArPandoraOutput::Collect3DHits --- found a 2D hit in a 3D cluster";
498 pfoToThreeDHitsMap.at(pfoId).push_back(caloHitList.size());
499 caloHitList.push_back(pCaloHit3D);
510 pandora::CaloHitVector& caloHits)
513 pandora::CaloHitList threeDHits;
516 caloHits.insert(caloHits.end(), threeDHits.begin(), threeDHits.end());
524 const pandora::CaloHitList& threeDHitList,
529 for (
const pandora::Cluster*
const pCluster : clusterList) {
532 <<
" LArPandoraOutput::GetPandoraToArtHitMap --- found a 3D input cluster ";
534 pandora::CaloHitVector sortedHits;
537 for (
const pandora::CaloHit*
const pCaloHit : sortedHits) {
538 if (!pandoraHitToArtHitMap
539 .insert(CaloHitToArtHitMap::value_type(
543 <<
" LArPandoraOutput::GetPandoraToArtHitMap --- found repeated input hits ";
547 for (
const pandora::CaloHit*
const pCaloHit : threeDHitList) {
548 if (pCaloHit->GetHitType() != pandora::TPC_3D)
550 <<
" LArPandoraOutput::GetPandoraToArtHitMap --- found a non-3D hit in the input list ";
553 if (!pandoraHitToArtHitMap
554 .insert(CaloHitToArtHitMap::value_type(
557 idToHitMap, static_cast<const pandora::CaloHit*>(pCaloHit->GetParentAddress()))))
560 <<
" LArPandoraOutput::GetPandoraToArtHitMap --- found repeated input hits ";
573 for (
unsigned int depth = 0, maxDepth = 2; depth < maxDepth; ++depth) {
575 const pandora::CaloHit* pParentCaloHit = pCaloHit;
576 for (
unsigned int i = 0; i < depth; ++i)
577 pParentCaloHit = static_cast<const pandora::CaloHit*>(pCaloHit->GetParentAddress());
580 const void*
const pHitAddress(pParentCaloHit->GetParentAddress());
581 const intptr_t hitID_temp((intptr_t)(pHitAddress));
582 const int hitID((
int)(hitID_temp));
587 if (idToHitMap.end() == artIter)
continue;
589 return artIter->second;
593 <<
" LArPandoraOutput::GetHit --- found a Pandora hit without a parent ART hit ";
602 for (
size_t vertexId = 0; vertexId < vertexVector.size(); ++vertexId)
611 const pandora::CaloHitList& threeDHitList,
616 pandora::CaloHitVector threeDHitVector;
617 threeDHitVector.insert(threeDHitVector.end(), threeDHitList.begin(), threeDHitList.end());
619 for (
unsigned int hitId = 0; hitId < threeDHitVector.size(); hitId++) {
620 const pandora::CaloHit*
const pCaloHit(threeDHitVector.at(hitId));
623 if (it == pandoraHitToArtHitMap.end())
624 throw cet::exception(
"LArPandora") <<
" LArPandoraOutput::BuildSpacePoints --- found a " 625 "pandora hit without a corresponding art hit ";
628 event, instanceLabel, hitId, {it->second}, outputSpacePointsToHits);
638 const pandora::ClusterList& clusterList,
648 auto const clock_data =
650 auto const det_prop =
655 size_t nextClusterId(0);
657 for (
const pandora::Cluster*
const pCluster : clusterList) {
658 std::vector<HitVector> hitVectors;
659 const std::vector<recob::Cluster> clusters(
663 pandoraHitToArtHitMap,
664 pandoraClusterToArtClustersMap,
669 if (hitVectors.size() != clusters.size())
671 <<
" LArPandoraOutput::BuildClusters --- invalid hit vectors for clusters produced ";
673 for (
unsigned int i = 0; i < clusters.size(); ++i) {
675 event, instanceLabel, nextClusterId - 1, hitVectors.at(i), outputClustersToHits);
676 outputClusters->push_back(clusters.at(i));
682 it != pfoToClustersMap.end();
684 if (!pfoToArtClustersMap.insert(IdToIdVectorMap::value_type(it->first, {})).second)
686 <<
" LArPandoraOutput::BuildClusters --- repeated pfo ids ";
688 for (
const size_t pandoraClusterId : it->second) {
691 if (it2 == pandoraClusterToArtClustersMap.end())
692 throw cet::exception(
"LArPandora") <<
" LArPandoraOutput::BuildClusters --- found a " 693 "pandora cluster with no associated recob cluster ";
695 for (
const size_t recobClusterId : it2->second)
696 pfoToArtClustersMap.at(it->first).push_back(recobClusterId);
706 const pandora::PfoVector& pfoVector,
715 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
716 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
721 if (pfoToVerticesMap.find(pfoId) != pfoToVerticesMap.end())
723 event, instanceLabel, pfoId, pfoToVerticesMap, outputParticlesToVertices);
725 if (pfoToThreeDHitsMap.find(pfoId) != pfoToThreeDHitsMap.end())
727 event, instanceLabel, pfoId, pfoToThreeDHitsMap, outputParticlesToSpacePoints);
729 if (pfoToArtClustersMap.find(pfoId) != pfoToArtClustersMap.end())
731 event, instanceLabel, pfoId, pfoToArtClustersMap, outputParticlesToClusters);
741 const pandora::PfoVector& pfoVector,
745 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
746 if (pfoToVerticesMap.find(pfoId) != pfoToVerticesMap.end())
748 event, instanceLabel, pfoId, pfoToVerticesMap, outputParticlesToVertices);
757 const pandora::PfoVector& pfoVector,
761 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
762 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
767 outputParticleMetadata->size(),
768 outputParticlesToMetadata);
771 outputParticleMetadata->push_back(pPFParticleMetadata);
779 const pandora::Pandora*
const pPrimaryPandora,
782 const pandora::PfoVector& pfoVector,
796 outputParticlesToSlices,
802 pandora::PfoVector slicePfos;
806 for (
const pandora::ParticleFlowObject*
const pSlicePfo : slicePfos)
808 pSlicePfo, event, instanceLabel, idToHitMap, outputSlices, outputSlicesToHits);
811 std::unordered_map<const pandora::ParticleFlowObject*, unsigned int> parentPfoToSliceIndexMap;
812 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
813 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
820 if (!parentPfoToSliceIndexMap
823 pPfo, event, instanceLabel, idToHitMap, outputSlices, outputSlicesToHits))
826 <<
" LArPandoraOutput::BuildSlices --- found repeated primary particles ";
830 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
831 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
839 outputParticlesToSlices);
844 const pandora::ParticleFlowObject*
const pParent(
846 if (parentPfoToSliceIndexMap.find(pParent) == parentPfoToSliceIndexMap.end())
848 <<
" LArPandoraOutput::BuildSlices --- found pfo without a parent in the input list ";
852 event, instanceLabel, pfoId, parentPfoToSliceIndexMap.at(pParent), outputParticlesToSlices);
866 const unsigned int sliceIndex(outputSlices->size());
867 outputSlices->emplace_back(
868 sliceIndex, bogusPoint, bogusVector, bogusPoint, bogusPoint, bogusFloat, bogusFloat);
879 const pandora::PfoVector& pfoVector,
895 mf::LogDebug(
"LArPandora") <<
" - Making associations " << outputSlicesToHits->size()
899 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId)
901 event, instanceLabel, pfoId, sliceIndex, outputParticlesToSlices);
917 pandora::PfoList pfosInSlice;
922 pandora::CaloHitList hits;
923 for (
const pandora::ParticleFlowObject*
const pPfo : pfosInSlice) {
925 {pandora::TPC_VIEW_U, pandora::TPC_VIEW_V, pandora::TPC_VIEW_W}) {
932 for (
const pandora::CaloHit*
const pCaloHit : hits)
947 const pandora::PfoVector& pfoVector,
952 for (
unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
953 const pandora::ParticleFlowObject*
const pPfo(pfoVector.at(pfoId));
959 event, instanceLabel, pfoId, nextT0Id - 1, outputParticlesToT0s);
960 outputT0s->push_back(t0);
969 const pandora::PfoVector& pfoVector)
972 const pandora::PfoList& parentList(pPfo->GetParentPfoList());
973 if (parentList.size() > 1)
975 <<
" LArPandoraOutput::BuildPFParticle --- this pfo has multiple parent particles ";
977 const size_t parentId(parentList.empty() ?
982 std::vector<size_t> daughterIds;
983 for (
const pandora::ParticleFlowObject*
const pDaughterPfo : pPfo->GetDaughterPfoList())
986 std::sort(daughterIds.begin(), daughterIds.end());
997 pVertex->GetPosition().GetX(), pVertex->GetPosition().GetY(), pVertex->GetPosition().GetZ()};
1005 pandora::CaloHitVector& sortedHits)
1007 if (!sortedHits.empty())
1009 <<
" LArPandoraOutput::GetHitsInCluster --- vector to hold hits is not empty ";
1011 pandora::CaloHitList hitList;
1012 pCluster->GetOrderedCaloHitList().FillCaloHitList(hitList);
1013 hitList.insert(hitList.end(),
1014 pCluster->GetIsolatedCaloHitList().begin(),
1015 pCluster->GetIsolatedCaloHitList().end());
1017 sortedHits.insert(sortedHits.end(), hitList.begin(), hitList.end());
1024 std::vector<recob::Cluster>
1026 const pandora::Cluster*
const pCluster,
1027 const pandora::ClusterList& clusterList,
1030 std::vector<HitVector>& hitVectors,
1034 std::vector<recob::Cluster> clusters;
1038 if (!pandoraClusterToArtClustersMap.insert(IdToIdVectorMap::value_type(clusterId, {})).second)
1040 <<
" LArPandoraOutput::BuildClusters --- repeated clusters in input list ";
1042 pandora::CaloHitVector sortedHits;
1048 for (
const pandora::CaloHit*
const pCaloHit2D : sortedHits) {
1050 if (it == pandoraHitToArtHitMap.end())
1052 <<
" LArPandoraOutput::BuildClusters --- couldn't find art hit for input pandora hit ";
1057 const unsigned int volID(100000 * wireID.Cryostat + wireID.TPC);
1058 hitArray[volID].push_back(hit);
1060 if (pCaloHit2D->IsIsolated()) isolatedHits.insert(hit);
1063 if (hitArray.empty())
1065 <<
" LArPandoraOutput::BuildClusters --- found a cluster with no hits ";
1067 for (
const HitArray::value_type& hitArrayEntry : hitArray) {
1068 const HitVector& clusterHits(hitArrayEntry.second);
1072 hitVectors.push_back(clusterHits);
1073 pandoraClusterToArtClustersMap.at(clusterId).push_back(nextId);
1090 if (hitVector.empty())
1092 <<
" LArPandoraOutput::BuildCluster --- No input hits were provided ";
1103 std::vector<recob::Hit const*> hits_for_params;
1104 hits_for_params.reserve(hitVector.size());
1107 const double thisWire(
hit->WireID().Wire);
1108 const double thisWireSigma(0.5);
1109 const double thisTime(
hit->PeakTime());
1110 const double thisTimeSigma(
double(2. *
hit->RMS()));
1116 planeID = thisPlaneID;
1119 if (!(thisView == view && thisPlaneID == planeID)) {
1121 <<
" LArPandoraOutput::BuildCluster --- Input hits have inconsistent plane IDs ";
1124 hits_for_params.push_back(&*
hit);
1126 if (isolatedHits.count(
hit))
continue;
1128 if (thisWire < startWire || (thisWire == startWire && thisTime < startTime)) {
1129 startWire = thisWire;
1130 sigmaStartWire = thisWireSigma;
1131 startTime = thisTime;
1132 sigmaStartTime = thisTimeSigma;
1135 if (thisWire > endWire || (thisWire == endWire && thisTime > endTime)) {
1137 sigmaEndWire = thisWireSigma;
1139 sigmaEndTime = thisTimeSigma;
1144 algo.
SetHits(gser, hits_for_params);
1169 const size_t spacePointId)
1171 if (pandora::TPC_3D != pCaloHit->GetHitType())
1173 <<
" LArPandoraOutput::BuildSpacePoint --- trying to build a space point from a 2D hit";
1175 const pandora::CartesianVector point(pCaloHit->GetPositionVector());
1176 double xyz[3] = {point.GetX(), point.GetY(), point.GetZ()};
1179 double dxdydz[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
1189 const pandora::ParticleFlowObject*
const pPfo,
1190 const pandora::PfoVector& pfoVector,
1195 const float x0(pParent->GetPropertiesMap().count(
"X0") ? pParent->GetPropertiesMap().at(
"X0") :
1199 auto const det_prop =
1201 const double cm_per_tick(det_prop.GetXTicksCoefficient());
1205 const double T0(x0 * ns_per_tick / cm_per_tick);
1207 if (std::fabs(T0) <= std::numeric_limits<double>::epsilon())
return false;
1219 : m_pPrimaryPandora(nullptr)
1220 , m_shouldRunStitching(false)
1221 , m_shouldProduceAllOutcomes(false)
1222 , m_shouldProduceTestBeamInteractionVertices(false)
1223 , m_isNeutrinoRecoOnlyNoSlicing(false)
1233 <<
" LArPandoraOutput::Settings::Validate --- primary Pandora instance does not exist ";
1239 <<
" LArPandoraOutput::Settings::Validate --- all outcomes instance label not set ";
code to link reconstructed objects back to the MC truth information
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
geo::WireID WireID() const
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 ...
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
std::map< int, art::Ptr< recob::Hit > > IdToHitMap
static art::Ptr< recob::Hit > GetHit(const IdToHitMap &idToHitMap, const pandora::CaloHit *const pCaloHit)
Look up ART hit from an input Pandora 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.
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.
art framework interface to geometry description
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
std::vector< size_t > IdVector
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 ...
Metadata associated to PFParticles.
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.
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.
ProductID put(std::unique_ptr< PROD > &&edp, std::string const &instance={})
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.
double distance(double x1, double y1, double z1, double x2, double y2, double z2)
virtual void SetHits(util::GeometryUtilities const &gser, std::vector< recob::Hit const * > const &hits)=0
Sets the list of input hits.
static const PandoraInstanceList & GetDaughterPandoraInstanceList(const pandora::Pandora *const pPrimaryPandora)
Get the list of daughter pandora instances associated with a given primary pandora instance...
static int max(int a, int b)
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
Declaration of signal hit object.
Hierarchical representation of particle flow.
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.
void function(int client, int *resource, int parblock, int *test, int p)
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...
std::string to_string(ModuleType const mt)
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
cet::coded_exception< error, detail::translate > exception
static larpandoraobj::PFParticleMetadata GetPFParticleMetadata(const pandora::ParticleFlowObject *const pPfo)
Get metadata associated to a PFO.
QTextStream & endl(QTextStream &s)
Event finding and building.