LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
lar_pandora::LArPandoraOutput Class Reference

#include "LArPandoraOutput.h"

Classes

class  Settings
 Settings class. More...
 

Public Types

typedef std::vector< size_t > IdVector
 
typedef std::map< size_t, IdVectorIdToIdVectorMap
 
typedef std::map< const pandora::CaloHit *, art::Ptr< recob::Hit > > CaloHitToArtHitMap
 
typedef std::unique_ptr< std::vector< recob::PFParticle > > PFParticleCollection
 
typedef std::unique_ptr< std::vector< recob::Vertex > > VertexCollection
 
typedef std::unique_ptr< std::vector< recob::Cluster > > ClusterCollection
 
typedef std::unique_ptr< std::vector< recob::SpacePoint > > SpacePointCollection
 
typedef std::unique_ptr< std::vector< anab::T0 > > T0Collection
 
typedef std::unique_ptr< std::vector< larpandoraobj::PFParticleMetadata > > PFParticleMetadataCollection
 
typedef std::unique_ptr< std::vector< recob::Slice > > SliceCollection
 
typedef std::unique_ptr< art::Assns< recob::PFParticle, larpandoraobj::PFParticleMetadata > > PFParticleToMetadataCollection
 
typedef std::unique_ptr< art::Assns< recob::PFParticle, recob::SpacePoint > > PFParticleToSpacePointCollection
 
typedef std::unique_ptr< art::Assns< recob::PFParticle, recob::Cluster > > PFParticleToClusterCollection
 
typedef std::unique_ptr< art::Assns< recob::PFParticle, recob::Vertex > > PFParticleToVertexCollection
 
typedef std::unique_ptr< art::Assns< recob::PFParticle, anab::T0 > > PFParticleToT0Collection
 
typedef std::unique_ptr< art::Assns< recob::PFParticle, recob::Slice > > PFParticleToSliceCollection
 
typedef std::unique_ptr< art::Assns< recob::Cluster, recob::Hit > > ClusterToHitCollection
 
typedef std::unique_ptr< art::Assns< recob::SpacePoint, recob::Hit > > SpacePointToHitCollection
 
typedef std::unique_ptr< art::Assns< recob::Slice, recob::Hit > > SliceToHitCollection
 

Static Public Member Functions

static void ProduceArtOutput (const Settings &settings, const IdToHitMap &idToHitMap, art::Event &evt)
 Convert the Pandora PFOs into ART clusters and write into ART event. More...
 
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. More...
 
static void GetPandoraSlices (const pandora::Pandora *const pPrimaryPandora, pandora::PfoVector &slicePfos)
 Get the slice pfos - one pfo per slice. More...
 
static bool IsClearCosmic (const pandora::ParticleFlowObject *const pPfo)
 Check if the input pfo is an unambiguous cosmic ray. More...
 
static bool IsFromSlice (const pandora::ParticleFlowObject *const pPfo)
 Check if the input pfo is from a slice. More...
 
static unsigned int GetSliceIndex (const pandora::ParticleFlowObject *const pPfo)
 Get the index of the slice from which this pfo was produced. More...
 
static pandora::PfoVector CollectPfos (const pandora::Pandora *const pPrimaryPandora)
 Collect the current pfos (including all downstream pfos) from the master pandora instance. More...
 
static pandora::PfoVector CollectAllPfoOutcomes (const pandora::Pandora *const pPrimaryPandora)
 Collect the pfos (including all downstream pfos) from the master and daughter pandora instances. More...
 
static void CollectPfos (const pandora::PfoList &parentPfoList, pandora::PfoVector &pfoVector)
 Collect a sorted list of all downstream pfos of an input list of parent. More...
 
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 ordered. More...
 
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 pfoVector is ordered. More...
 
static void Collect3DHits (const pandora::ParticleFlowObject *const pPfo, pandora::CaloHitVector &caloHits)
 Collect a sorted vector of all 3D hits in the input pfo. More...
 
static pandora::CaloHitList Collect3DHits (const pandora::PfoVector &pfoVector, IdToIdVectorMap &pfoToThreeDHitsMap)
 Collect a sorted list of all 3D hits contained in the input pfo list Order is guaranteed provided pfoVector is ordered. More...
 
template<typename T >
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. More...
 
template<typename T >
static size_t GetId (const T *const pT, const std::vector< const T * > &tVector)
 Find the index of an input object in an input vector. Throw an exception if it doesn't exist. More...
 
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 corresponding ART hit. More...
 
static art::Ptr< recob::HitGetHit (const IdToHitMap &idToHitMap, const pandora::CaloHit *const pCaloHit)
 Look up ART hit from an input Pandora hit. More...
 
static void BuildVertices (const pandora::VertexVector &vertexVector, VertexCollection &outputVertices)
 Convert pandora vertices to ART vertices and add them to the output vector. More...
 
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 between spacepoints and hits. More...
 
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 between clusters and hits. For multiple drift volumes, each pandora cluster can correspond to multiple ART clusters. More...
 
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 between PFParticle and vertices, spacepoints and clusters. More...
 
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. More...
 
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. More...
 
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. More...
 
static unsigned int BuildDummySlice (SliceCollection &outputSlices)
 Build a new slice object with dummy information. More...
 
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. More...
 
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" from the slicing instance. More...
 
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 PFParticle and T0s. More...
 
static recob::Vertex BuildVertex (const pandora::Vertex *const pVertex, const size_t vertexId)
 Convert from a pandora vertex to an ART vertex. More...
 
static recob::SpacePoint BuildSpacePoint (const pandora::CaloHit *const pCaloHit, const size_t spacePointId)
 Convert from a pandora 3D hit to an ART spacepoint. More...
 
static void GetHitsInCluster (const pandora::Cluster *const pCluster, pandora::CaloHitVector &sortedHits)
 Collect a sorted list of all 2D hits in a cluster. More...
 
static std::vector< recob::ClusterBuildClusters (util::GeometryUtilities const &gser, const pandora::Cluster *const pCluster, const pandora::ClusterList &clusterList, const CaloHitToArtHitMap &pandoraHitToArtHitMap, IdToIdVectorMap &pandoraClusterToArtClustersMap, std::vector< HitVector > &hitVectors, size_t &nextId, cluster::ClusterParamsAlgBase &algo)
 Convert from a pandora 2D cluster to a vector of ART clusters (produce multiple if the cluster is split over drift volumes) More...
 
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. More...
 
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. More...
 
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. More...
 
template<typename A , typename B >
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. More...
 
template<typename A , typename B >
static void AddAssociation (const art::Event &event, const std::string &instanceLabel, const size_t idA, const IdToIdVectorMap &aToBMap, std::unique_ptr< art::Assns< A, B >> &association)
 Add associations between input objects. More...
 
template<typename A , typename B >
static void AddAssociation (const art::Event &event, const std::string &instanceLabel, const size_t idA, const std::vector< art::Ptr< B >> &bVector, std::unique_ptr< art::Assns< A, B >> &association)
 Add associations between input objects. More...
 

Detailed Description

Definition at line 46 of file LArPandoraOutput.h.

Member Typedef Documentation

typedef std::map<const pandora::CaloHit*, art::Ptr<recob::Hit> > lar_pandora::LArPandoraOutput::CaloHitToArtHitMap

Definition at line 50 of file LArPandoraOutput.h.

typedef std::unique_ptr<std::vector<recob::Cluster> > lar_pandora::LArPandoraOutput::ClusterCollection

Definition at line 54 of file LArPandoraOutput.h.

Definition at line 49 of file LArPandoraOutput.h.

typedef std::vector<size_t> lar_pandora::LArPandoraOutput::IdVector

Definition at line 48 of file LArPandoraOutput.h.

Definition at line 52 of file LArPandoraOutput.h.

typedef std::unique_ptr<std::vector<recob::Slice> > lar_pandora::LArPandoraOutput::SliceCollection

Definition at line 59 of file LArPandoraOutput.h.

Definition at line 55 of file LArPandoraOutput.h.

typedef std::unique_ptr<std::vector<anab::T0> > lar_pandora::LArPandoraOutput::T0Collection

Definition at line 56 of file LArPandoraOutput.h.

typedef std::unique_ptr<std::vector<recob::Vertex> > lar_pandora::LArPandoraOutput::VertexCollection

Definition at line 53 of file LArPandoraOutput.h.

Member Function Documentation

template<typename A , typename B >
void lar_pandora::LArPandoraOutput::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 
)
inlinestatic

Add an association between objects with two given ids.

Parameters
eventthe ART event
idAthe id of an object of type A
idBthe id of an object of type B to associate to the first object
associationthe output association to update

Definition at line 653 of file LArPandoraOutput.h.

Referenced by AssociateAdditionalVertices(), BuildClusters(), BuildParticleMetadata(), BuildPFParticles(), BuildSlice(), BuildSlices(), BuildSpacePoints(), BuildT0s(), and CopyAllHitsToSingleSlice().

658  {
659  const art::PtrMaker<A> makePtrA(event, instanceLabel);
660  art::Ptr<A> pA(makePtrA(idA));
661 
662  const art::PtrMaker<B> makePtrB(event, instanceLabel);
663  art::Ptr<B> pB(makePtrB(idB));
664 
665  association->addSingle(pA, pB);
666  }
Definition: fwd.h:26
template<typename A , typename B >
void lar_pandora::LArPandoraOutput::AddAssociation ( const art::Event event,
const std::string &  instanceLabel,
const size_t  idA,
const IdToIdVectorMap aToBMap,
std::unique_ptr< art::Assns< A, B >> &  association 
)
inlinestatic

Add associations between input objects.

Parameters
eventthe ART event
idAthe id of an object of type A
aToBMapthe input mapping from IDs of objects of type A to IDs of objects of type B to associate
associationthe output association to update

Definition at line 671 of file LArPandoraOutput.h.

676  {
677  IdToIdVectorMap::const_iterator it(aToBMap.find(idA));
678  if (it == aToBMap.end())
679  throw cet::exception("LArPandora")
680  << " LArPandoraOutput::AddAssociation --- id doesn't exists in the assocaition map";
681 
682  const art::PtrMaker<A> makePtrA(event, instanceLabel);
683  art::Ptr<A> pA(makePtrA(idA));
684 
685  const art::PtrMaker<B> makePtrB(event, instanceLabel);
686  for (const size_t idB : it->second) {
687  art::Ptr<B> pB(makePtrB(idB));
688  association->addSingle(pA, pB);
689  }
690  }
intermediate_table::const_iterator const_iterator
Definition: fwd.h:26
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
template<typename A , typename B >
void lar_pandora::LArPandoraOutput::AddAssociation ( const art::Event event,
const std::string &  instanceLabel,
const size_t  idA,
const std::vector< art::Ptr< B >> &  bVector,
std::unique_ptr< art::Assns< A, B >> &  association 
)
inlinestatic

Add associations between input objects.

Parameters
eventthe ART event
idAthe id of an object of type A
bVectorthe input vector of IDs of objects of type B to associate
associationthe output association to update

Definition at line 695 of file LArPandoraOutput.h.

700  {
701  const art::PtrMaker<A> makePtrA(event, instanceLabel);
702  art::Ptr<A> pA(makePtrA(idA));
703 
704  for (const art::Ptr<B>& pB : bVector)
705  association->addSingle(pA, pB);
706  }
Definition: fwd.h:26
void lar_pandora::LArPandoraOutput::AssociateAdditionalVertices ( const art::Event event,
const std::string &  instanceLabel,
const pandora::PfoVector &  pfoVector,
const IdToIdVectorMap pfoToVerticesMap,
PFParticleToVertexCollection outputParticlesToVertices 
)
static

Convert Create the associations between pre-existing PFParticle and additional vertices.

Parameters
eventthe art event
instanceLabelinstance label
pfoVectorthe input list of pfos to convert
pfoToVerticesMapthe input mapping from pfo ID to vertex IDs
outputParticlesToVerticesthe output associations between PFParticles and vertices

Definition at line 713 of file LArPandoraOutput.cxx.

References AddAssociation().

Referenced by ProduceArtOutput().

719  {
720  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
721  if (pfoToVerticesMap.find(pfoId) != pfoToVerticesMap.end())
723  event, instanceLabel, pfoId, pfoToVerticesMap, outputParticlesToVertices);
724  }
725  }
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.
recob::Cluster lar_pandora::LArPandoraOutput::BuildCluster ( util::GeometryUtilities const &  gser,
const size_t  id,
const HitVector hitVector,
const HitList isolatedHits,
cluster::ClusterParamsAlgBase algo 
)
static

Build an ART cluster from an input vector of ART hits.

Parameters
idthe id code for the cluster
hitVectorthe input vector of hits
isolatedHitsthe input list of isolated hits
algoalgorithm set to fill cluster members
Returns
the ART cluster

If you don't know which algorithm to pick, StandardClusterParamsAlg is a good default. The hits that are isolated (that is, present in isolatedHits) are not fed to the cluster parameter algorithms.

Definition at line 1049 of file LArPandoraOutput.cxx.

References geo::kUnknown, cluster::ClusterCreator::move(), recob::Cluster::Sentry, and cluster::ClusterParamsAlgBase::SetHitsFromPointers().

Referenced by BuildClusters().

1054  {
1055  if (hitVector.empty())
1056  throw cet::exception("LArPandora")
1057  << " LArPandoraOutput::BuildCluster --- No input hits were provided ";
1058 
1059  // Fill list of cluster properties
1060  geo::View_t view(geo::kUnknown);
1061  geo::PlaneID planeID;
1062 
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);
1067 
1068  std::vector<recob::Hit const*> hits_for_params;
1069  hits_for_params.reserve(hitVector.size());
1070 
1071  for (const art::Ptr<recob::Hit>& hit : hitVector) {
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()));
1076  const geo::View_t thisView(hit->View());
1077  const geo::PlaneID thisPlaneID(hit->WireID().planeID());
1078 
1079  if (geo::kUnknown == view) {
1080  view = thisView;
1081  planeID = thisPlaneID;
1082  }
1083 
1084  if (!(thisView == view && thisPlaneID == planeID)) {
1085  throw cet::exception("LArPandora")
1086  << " LArPandoraOutput::BuildCluster --- Input hits have inconsistent plane IDs ";
1087  }
1088 
1089  hits_for_params.push_back(&*hit);
1090 
1091  if (isolatedHits.count(hit)) continue;
1092 
1093  if (thisWire < startWire || (thisWire == startWire && thisTime < startTime)) {
1094  startWire = thisWire;
1095  sigmaStartWire = thisWireSigma;
1096  startTime = thisTime;
1097  sigmaStartTime = thisTimeSigma;
1098  }
1099 
1100  if (thisWire > endWire || (thisWire == endWire && thisTime > endTime)) {
1101  endWire = thisWire;
1102  sigmaEndWire = thisWireSigma;
1103  endTime = thisTime;
1104  sigmaEndTime = thisTimeSigma;
1105  }
1106  }
1107 
1108  // feed the algorithm with all the cluster hits
1109  algo.SetHitsFromPointers(gser, hits_for_params);
1110 
1111  // create the recob::Cluster directly in the vector
1112  return cluster::ClusterCreator(gser,
1113  algo, // algo
1114  startWire, // start_wire
1115  sigmaStartWire, // sigma_start_wire
1116  startTime, // start_tick
1117  sigmaStartTime, // sigma_start_tick
1118  endWire, // end_wire
1119  sigmaEndWire, // sigma_end_wire
1120  endTime, // end_tick
1121  sigmaEndTime, // sigma_end_tick
1122  id, // ID
1123  view, // view
1124  planeID, // plane
1125  recob::Cluster::Sentry // sentry
1126  )
1127  .move();
1128  }
Class managing the creation of a new recob::Cluster object.
enum geo::_plane_proj View_t
Enumerate the possible plane projections.
Unknown view.
Definition: geo_types.h:142
The data type to uniquely identify a Plane.
Definition: geo_types.h:463
virtual void SetHitsFromPointers(util::GeometryUtilities const &gser, std::vector< recob::Hit const * > const &hits)=0
Sets the list of input hits.
static const SentryArgument_t Sentry
An instance of the sentry object.
Definition: Cluster.h:174
Detector simulation of raw signals on wires.
recob::Cluster && move()
Prepares the constructed hit to be moved away.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
void lar_pandora::LArPandoraOutput::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 
)
static

Convert pandora 2D clusters to ART clusters and add them to the output vector Create the associations between clusters and hits. For multiple drift volumes, each pandora cluster can correspond to multiple ART clusters.

Parameters
eventthe art event
clusterListthe input list of 2D pandora clusters to convert
pandoraHitToArtHitMapthe input mapping from pandora hits to ART hits
pfoToClustersMapthe input mapping from pfo ID to cluster IDs
outputClustersthe output vector of clusters
outputClustersToHitsthe output associations between clusters and hits
pfoToArtClustersMapthe output mapping from pfo ID to art cluster ID

Definition at line 612 of file LArPandoraOutput.cxx.

References AddAssociation().

Referenced by ProduceArtOutput().

620  {
621  cluster::StandardClusterParamsAlg clusterParamAlgo;
622 
624  auto const clock_data =
626  auto const det_prop =
628  util::GeometryUtilities const gser{*geom, clock_data, det_prop};
629 
630  // Produce the art clusters
631  size_t nextClusterId(0);
632  IdToIdVectorMap pandoraClusterToArtClustersMap;
633  for (const pandora::Cluster* const pCluster : clusterList) {
634  std::vector<HitVector> hitVectors;
635  const std::vector<recob::Cluster> clusters(
637  pCluster,
638  clusterList,
639  pandoraHitToArtHitMap,
640  pandoraClusterToArtClustersMap,
641  hitVectors,
642  nextClusterId,
643  clusterParamAlgo));
644 
645  if (hitVectors.size() != clusters.size())
646  throw cet::exception("LArPandora")
647  << " LArPandoraOutput::BuildClusters --- invalid hit vectors for clusters produced ";
648 
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));
653  }
654  }
655 
656  // Get mapping from pfo id to art cluster id
657  for (IdToIdVectorMap::const_iterator it = pfoToClustersMap.begin();
658  it != pfoToClustersMap.end();
659  ++it) {
660  if (!pfoToArtClustersMap.insert(IdToIdVectorMap::value_type(it->first, {})).second)
661  throw cet::exception("LArPandora")
662  << " LArPandoraOutput::BuildClusters --- repeated pfo ids ";
663 
664  for (const size_t pandoraClusterId : it->second) {
665  IdToIdVectorMap::const_iterator it2(pandoraClusterToArtClustersMap.find(pandoraClusterId));
666 
667  if (it2 == pandoraClusterToArtClustersMap.end())
668  throw cet::exception("LArPandora") << " LArPandoraOutput::BuildClusters --- found a "
669  "pandora cluster with no associated recob cluster ";
670 
671  for (const size_t recobClusterId : it2->second)
672  pfoToArtClustersMap.at(it->first).push_back(recobClusterId);
673  }
674  }
675  }
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...
std::map< size_t, IdVector > IdToIdVectorMap
Algorithm collection class computing cluster parameters.
intermediate_table::const_iterator const_iterator
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.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
std::vector< recob::Cluster > lar_pandora::LArPandoraOutput::BuildClusters ( util::GeometryUtilities const &  gser,
const pandora::Cluster *const  pCluster,
const pandora::ClusterList &  clusterList,
const CaloHitToArtHitMap pandoraHitToArtHitMap,
IdToIdVectorMap pandoraClusterToArtClustersMap,
std::vector< HitVector > &  hitVectors,
size_t &  nextId,
cluster::ClusterParamsAlgBase algo 
)
static

Convert from a pandora 2D cluster to a vector of ART clusters (produce multiple if the cluster is split over drift volumes)

Parameters
pClusterthe input cluster
clusterListthe input list of clusters
pandoraHitToArtHitMapthe input mapping from pandora hits to ART hits
pandoraClusterToArtClustersMapoutput mapping from pandora cluster ID to art cluster IDs
hitVectorsthe output vectors of hits for each cluster produced used to produce associations
algoalgorithm set to fill cluster members
thevector of ART clusters

Definition at line 990 of file LArPandoraOutput.cxx.

References BuildCluster(), GetHitsInCluster(), GetId(), and recob::Hit::WireID().

999  {
1000  std::vector<recob::Cluster> clusters;
1001 
1002  // Get the cluster ID and set up the map entry
1003  const size_t clusterId(LArPandoraOutput::GetId(pCluster, clusterList));
1004  if (!pandoraClusterToArtClustersMap.insert(IdToIdVectorMap::value_type(clusterId, {})).second)
1005  throw cet::exception("LArPandora")
1006  << " LArPandoraOutput::BuildClusters --- repeated clusters in input list ";
1007 
1008  pandora::CaloHitVector sortedHits;
1009  LArPandoraOutput::GetHitsInCluster(pCluster, sortedHits);
1010 
1011  HitArray hitArray; // hits organised by drift volume
1012  HitList isolatedHits;
1013 
1014  for (const pandora::CaloHit* const pCaloHit2D : sortedHits) {
1015  CaloHitToArtHitMap::const_iterator it(pandoraHitToArtHitMap.find(pCaloHit2D));
1016  if (it == pandoraHitToArtHitMap.end())
1017  throw cet::exception("LArPandora")
1018  << " LArPandoraOutput::BuildClusters --- couldn't find art hit for input pandora hit ";
1019 
1020  const art::Ptr<recob::Hit> hit(it->second);
1021 
1022  const geo::WireID wireID(hit->WireID());
1023  const unsigned int volID(100000 * wireID.Cryostat + wireID.TPC);
1024  hitArray[volID].push_back(hit);
1025 
1026  if (pCaloHit2D->IsIsolated()) isolatedHits.insert(hit);
1027  }
1028 
1029  if (hitArray.empty())
1030  throw cet::exception("LArPandora")
1031  << " LArPandoraOutput::BuildClusters --- found a cluster with no hits ";
1032 
1033  for (const HitArray::value_type& hitArrayEntry : hitArray) {
1034  const HitVector& clusterHits(hitArrayEntry.second);
1035 
1036  clusters.push_back(
1037  LArPandoraOutput::BuildCluster(gser, nextId, clusterHits, isolatedHits, algo));
1038  hitVectors.push_back(clusterHits);
1039  pandoraClusterToArtClustersMap.at(clusterId).push_back(nextId);
1040 
1041  nextId++;
1042  }
1043 
1044  return clusters;
1045  }
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.
std::map< int, HitVector > HitArray
static void GetHitsInCluster(const pandora::Cluster *const pCluster, pandora::CaloHitVector &sortedHits)
Collect a sorted list of all 2D hits in a cluster.
intermediate_table::const_iterator const_iterator
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&#39;t exist...
Detector simulation of raw signals on wires.
std::vector< art::Ptr< recob::Hit > > HitVector
std::set< art::Ptr< recob::Hit > > HitList
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
unsigned int lar_pandora::LArPandoraOutput::BuildDummySlice ( SliceCollection outputSlices)
static

Build a new slice object with dummy information.

Parameters
outputSlicesthe output collection of slices to populate

Definition at line 829 of file LArPandoraOutput.cxx.

Referenced by BuildSlice(), and CopyAllHitsToSingleSlice().

830  {
831  // Make a slice with dummy properties
832  const float bogusFloat(std::numeric_limits<float>::max());
833  const recob::tracking::Point_t bogusPoint(bogusFloat, bogusFloat, bogusFloat);
834  const recob::tracking::Vector_t bogusVector(bogusFloat, bogusFloat, bogusFloat);
835 
836  const unsigned int sliceIndex(outputSlices->size());
837  outputSlices->emplace_back(
838  sliceIndex, bogusPoint, bogusVector, bogusPoint, bogusPoint, bogusFloat, bogusFloat);
839 
840  return sliceIndex;
841  }
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 ...
Definition: TrackingTypes.h:31
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...
Definition: TrackingTypes.h:27
void lar_pandora::LArPandoraOutput::BuildParticleMetadata ( const art::Event event,
const std::string &  instanceLabel,
const pandora::PfoVector &  pfoVector,
PFParticleMetadataCollection outputParticleMetadata,
PFParticleToMetadataCollection outputParticlesToMetadata 
)
static

Build metadata objects from a list of input pfos.

Parameters
eventthe art event
pfoVectorthe input list of pfos
outputParticleMetadatathe output vector of PFParticleMetadata
outputParticlesToMetadatathe output associations between PFParticles and metadata

Definition at line 729 of file LArPandoraOutput.cxx.

References AddAssociation(), and lar_pandora::LArPandoraHelper::GetPFParticleMetadata().

Referenced by ProduceArtOutput().

735  {
736  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
737  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
738 
740  event, instanceLabel, pfoId, outputParticleMetadata->size(), outputParticlesToMetadata);
741  larpandoraobj::PFParticleMetadata pPFParticleMetadata(
743  outputParticleMetadata->push_back(pPFParticleMetadata);
744  }
745  }
Metadata associated to PFParticles.
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.
static larpandoraobj::PFParticleMetadata GetPFParticleMetadata(const pandora::ParticleFlowObject *const pPfo)
Get metadata associated to a PFO.
recob::PFParticle lar_pandora::LArPandoraOutput::BuildPFParticle ( const pandora::ParticleFlowObject *const  pPfo,
const size_t  pfoId,
const pandora::PfoVector &  pfoVector 
)
static

Convert from a pfo to and ART PFParticle.

Parameters
pPfothe input pfo to convert
pfoIdthe id of the pfo to produce
pfoVectorthe input list of pfos
theART PFParticle

Definition at line 934 of file LArPandoraOutput.cxx.

References GetId(), and recob::PFParticle::kPFParticlePrimary.

Referenced by BuildPFParticles().

937  {
938  // Get parent Pfo ID
939  const pandora::PfoList& parentList(pPfo->GetParentPfoList());
940  if (parentList.size() > 1)
941  throw cet::exception("LArPandora")
942  << " LArPandoraOutput::BuildPFParticle --- this pfo has multiple parent particles ";
943 
944  const size_t parentId(parentList.empty() ?
946  LArPandoraOutput::GetId(parentList.front(), pfoVector));
947 
948  // Get daughters Pfo IDs
949  std::vector<size_t> daughterIds;
950  for (const pandora::ParticleFlowObject* const pDaughterPfo : pPfo->GetDaughterPfoList())
951  daughterIds.push_back(LArPandoraOutput::GetId(pDaughterPfo, pfoVector));
952 
953  std::sort(daughterIds.begin(), daughterIds.end());
954 
955  return recob::PFParticle(pPfo->GetParticleId(), pfoId, parentId, daughterIds);
956  }
static constexpr size_t kPFParticlePrimary
Define index to signify primary particle.
Definition: PFParticle.h:57
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&#39;t exist...
Hierarchical representation of particle flow.
Definition: PFParticle.h:44
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
void lar_pandora::LArPandoraOutput::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 
)
static

Convert between pfos and PFParticles and add them to the output vector Create the associations between PFParticle and vertices, spacepoints and clusters.

Parameters
eventthe art event
pfoVectorthe input list of pfos to convert
pfoToVerticesMapthe input mapping from pfo ID to vertex IDs
pfoToThreeDHitsMapthe input mapping from pfo ID to 3D hit IDs
pfoToArtClustersMapthe input mapping from pfo ID to ART cluster IDs
outputParticlethe output vector of PFParticles
outputParticlesToVerticesthe output associations between PFParticles and vertices
outputParticlesToSpacePointsthe output associations between PFParticles and spacepoints
outputParticlesToClustersthe output associations between PFParticles and clusters

Definition at line 679 of file LArPandoraOutput.cxx.

References AddAssociation(), and BuildPFParticle().

Referenced by ProduceArtOutput().

690  {
691  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
692  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
693 
694  outputParticles->push_back(LArPandoraOutput::BuildPFParticle(pPfo, pfoId, pfoVector));
695 
696  // Associations from PFParticle
697  if (pfoToVerticesMap.find(pfoId) != pfoToVerticesMap.end())
699  event, instanceLabel, pfoId, pfoToVerticesMap, outputParticlesToVertices);
700 
701  if (pfoToThreeDHitsMap.find(pfoId) != pfoToThreeDHitsMap.end())
703  event, instanceLabel, pfoId, pfoToThreeDHitsMap, outputParticlesToSpacePoints);
704 
705  if (pfoToArtClustersMap.find(pfoId) != pfoToArtClustersMap.end())
707  event, instanceLabel, pfoId, pfoToArtClustersMap, outputParticlesToClusters);
708  }
709  }
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.
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.
unsigned int lar_pandora::LArPandoraOutput::BuildSlice ( const pandora::ParticleFlowObject *const  pParentPfo,
const art::Event event,
const std::string &  instanceLabel,
const IdToHitMap idToHitMap,
SliceCollection outputSlices,
SliceToHitCollection outputSlicesToHits 
)
static

Build a new slice object from a PFO, this can be a top-level parent in a hierarchy or a "slice PFO" from the slicing instance.

Parameters
pParentPfothe parent pfo from which to build the slice
eventthe art event
instanceLabelthe label for the collections to be produced
idToHitMapinput mapping from pandora hit ID to ART hit
outputSlicesthe output collection of slices to populate
outputSlicesToHitsthe output association from slices to hits

Definition at line 876 of file LArPandoraOutput.cxx.

References AddAssociation(), BuildDummySlice(), lar_content::LArPfoHelper::GetAllConnectedPfos(), lar_content::LArPfoHelper::GetCaloHits(), GetHit(), lar_content::LArPfoHelper::GetIsolatedCaloHits(), hits(), and lar_content::LArPfoHelper::SortByNHits().

Referenced by BuildSlices().

882  {
883  const unsigned int sliceIndex(LArPandoraOutput::BuildDummySlice(outputSlices));
884 
885  // Collect the pfos connected to the input primary pfos
886  pandora::PfoList pfosInSlice;
887  lar_content::LArPfoHelper::GetAllConnectedPfos(pParentPfo, pfosInSlice);
888  pfosInSlice.sort(lar_content::LArPfoHelper::SortByNHits);
889 
890  // Collect the hits from the pfos in all views
891  pandora::CaloHitList hits;
892  for (const pandora::ParticleFlowObject* const pPfo : pfosInSlice) {
893  for (const pandora::HitType& hitType :
894  {pandora::TPC_VIEW_U, pandora::TPC_VIEW_V, pandora::TPC_VIEW_W}) {
895  lar_content::LArPfoHelper::GetCaloHits(pPfo, hitType, hits);
897  }
898  }
899 
900  // Add the associations to the hits
901  for (const pandora::CaloHit* const pCaloHit : hits)
903  instanceLabel,
904  sliceIndex,
905  {LArPandoraOutput::GetHit(idToHitMap, pCaloHit)},
906  outputSlicesToHits);
907 
908  return sliceIndex;
909  }
static bool SortByNHits(const pandora::ParticleFlowObject *const pLhs, const pandora::ParticleFlowObject *const pRhs)
Sort pfos by number of constituent hits.
static unsigned int BuildDummySlice(SliceCollection &outputSlices)
Build a new slice object with dummy information.
static art::Ptr< recob::Hit > GetHit(const IdToHitMap &idToHitMap, const pandora::CaloHit *const pCaloHit)
Look up ART hit from an input Pandora hit.
void hits()
Definition: readHits.C:15
HitType
Definition: HitType.h:12
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.
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...
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.
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.
void lar_pandora::LArPandoraOutput::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 
)
static

Build slices - collections of hits which each describe a single particle hierarchy.

Parameters
settingsthe settings
pPrimaryPandorathe primary pandora instance
eventthe art event
instanceLabelthe label for the collections to be produced
pfoVectorthe input vector of all pfos to be output
idToHitMapinput mapping from pandora hit ID to ART hit
outputSlicesthe output collection of slices to populate
outputParticlesToSlicesthe output association from particles to slices
outputSlicesToHitsthe output association from slices to hits

Definition at line 749 of file LArPandoraOutput.cxx.

References AddAssociation(), BuildSlice(), CopyAllHitsToSingleSlice(), GetPandoraSlices(), lar_content::LArPfoHelper::GetParentPfo(), GetSliceIndex(), IsFromSlice(), and lar_pandora::LArPandoraOutput::Settings::m_isNeutrinoRecoOnlyNoSlicing.

Referenced by ProduceArtOutput().

758  {
759  // Check for the special case in which there are no slices, and only the neutrino reconstruction was used on all hits
760  if (settings.m_isNeutrinoRecoOnlyNoSlicing) {
762  event,
763  instanceLabel,
764  pfoVector,
765  idToHitMap,
766  outputSlices,
767  outputParticlesToSlices,
768  outputSlicesToHits);
769  return;
770  }
771 
772  // Collect the slice pfos - one per slice (if there is no slicing instance, this vector will be empty)
773  pandora::PfoVector slicePfos;
774  LArPandoraOutput::GetPandoraSlices(pPrimaryPandora, slicePfos);
775 
776  // Make one slice per Pandora Slice pfo
777  for (const pandora::ParticleFlowObject* const pSlicePfo : slicePfos)
779  pSlicePfo, event, instanceLabel, idToHitMap, outputSlices, outputSlicesToHits);
780 
781  // Make a slice for every remaining pfo hierarchy that wasn't already in a slice
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));
785 
786  // If this PFO is the parent of a hierarchy we have yet to use, then add a new slice
787  if (LArPandoraOutput::IsFromSlice(pPfo)) continue;
788 
789  if (lar_content::LArPfoHelper::GetParentPfo(pPfo) != pPfo) continue;
790 
791  if (!parentPfoToSliceIndexMap
792  .emplace(pPfo,
794  pPfo, event, instanceLabel, idToHitMap, outputSlices, outputSlicesToHits))
795  .second)
796  throw cet::exception("LArPandora")
797  << " LArPandoraOutput::BuildSlices --- found repeated primary particles ";
798  }
799 
800  // Add the associations from PFOs to slices
801  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
802  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
803 
804  // For PFOs that are from a Pandora slice, add the association and move on to the next PFO
805  if (LArPandoraOutput::IsFromSlice(pPfo)) {
807  instanceLabel,
808  pfoId,
810  outputParticlesToSlices);
811  continue;
812  }
813 
814  // Get the parent of the particle
815  const pandora::ParticleFlowObject* const pParent(
817  if (parentPfoToSliceIndexMap.find(pParent) == parentPfoToSliceIndexMap.end())
818  throw cet::exception("LArPandora")
819  << " LArPandoraOutput::BuildSlices --- found pfo without a parent in the input list ";
820 
821  // Add the association from the PFO to the slice
823  event, instanceLabel, pfoId, parentPfoToSliceIndexMap.at(pParent), outputParticlesToSlices);
824  }
825  }
static void GetPandoraSlices(const pandora::Pandora *const pPrimaryPandora, pandora::PfoVector &slicePfos)
Get the slice pfos - one pfo per slice.
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...
static bool IsFromSlice(const pandora::ParticleFlowObject *const pPfo)
Check if the input pfo is from a slice.
static const pandora::ParticleFlowObject * GetParentPfo(const pandora::ParticleFlowObject *const pPfo)
Get the primary parent pfo.
static unsigned int GetSliceIndex(const pandora::ParticleFlowObject *const pPfo)
Get the index of the slice from which this pfo was produced.
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.
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.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
recob::SpacePoint lar_pandora::LArPandoraOutput::BuildSpacePoint ( const pandora::CaloHit *const  pCaloHit,
const size_t  spacePointId 
)
static

Convert from a pandora 3D hit to an ART spacepoint.

Parameters
pCaloHitthe input hit
spacePointIdthe id of the space-point to produce
theART spacepoint

Definition at line 1132 of file LArPandoraOutput.cxx.

Referenced by BuildSpacePoints().

1134  {
1135  if (pandora::TPC_3D != pCaloHit->GetHitType())
1136  throw cet::exception("LArPandora")
1137  << " LArPandoraOutput::BuildSpacePoint --- trying to build a space point from a 2D hit";
1138 
1139  const pandora::CartesianVector point(pCaloHit->GetPositionVector());
1140  double xyz[3] = {point.GetX(), point.GetY(), point.GetZ()};
1141 
1142  // ATTN using dummy information
1143  double dxdydz[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; // TODO: Fill in the error matrix
1144  double chi2(0.0);
1145 
1146  return recob::SpacePoint(xyz, dxdydz, chi2, spacePointId);
1147  }
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
void lar_pandora::LArPandoraOutput::BuildSpacePoints ( const art::Event event,
const std::string &  instanceLabel,
const pandora::CaloHitList &  threeDHitList,
const CaloHitToArtHitMap pandoraHitToArtHitMap,
SpacePointCollection outputSpacePoints,
SpacePointToHitCollection outputSpacePointsToHits 
)
static

Convert pandora 3D hits to ART spacepoints and add them to the output vector Create the associations between spacepoints and hits.

Parameters
eventthe art event
threeDHitListthe input list of 3D hits to convert
pandoraHitToArtHitMapthe input mapping from pandora hits to ART hits
outputSpacePointsthe output vector of spacepoints
outputSpacePointsToHitsthe output associations between spacepoints and hits

Definition at line 586 of file LArPandoraOutput.cxx.

References AddAssociation(), and BuildSpacePoint().

Referenced by ProduceArtOutput().

592  {
593  pandora::CaloHitVector threeDHitVector;
594  threeDHitVector.insert(threeDHitVector.end(), threeDHitList.begin(), threeDHitList.end());
595 
596  for (unsigned int hitId = 0; hitId < threeDHitVector.size(); hitId++) {
597  const pandora::CaloHit* const pCaloHit(threeDHitVector.at(hitId));
598 
599  CaloHitToArtHitMap::const_iterator it(pandoraHitToArtHitMap.find(pCaloHit));
600  if (it == pandoraHitToArtHitMap.end())
601  throw cet::exception("LArPandora") << " LArPandoraOutput::BuildSpacePoints --- found a "
602  "pandora hit without a corresponding art hit ";
603 
605  event, instanceLabel, hitId, {it->second}, outputSpacePointsToHits);
606  outputSpacePoints->push_back(LArPandoraOutput::BuildSpacePoint(pCaloHit, hitId));
607  }
608  }
static recob::SpacePoint BuildSpacePoint(const pandora::CaloHit *const pCaloHit, const size_t spacePointId)
Convert from a pandora 3D hit to an ART spacepoint.
intermediate_table::const_iterator const_iterator
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.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
bool lar_pandora::LArPandoraOutput::BuildT0 ( const art::Event event,
const pandora::ParticleFlowObject *const  pPfo,
const pandora::PfoVector &  pfoVector,
size_t &  nextId,
anab::T0 t0 
)
static

If required, build a T0 for the input pfo.

Parameters
eventthe ART event
pPfothe input pfo
pfoVectorthe input list of pfos
nextIdthe ID of the T0 - will be incremented if the t0 was produced
t0the output T0
Returns
if a T0 was produced (calculated from the stitching hit shift distance)

Definition at line 1151 of file LArPandoraOutput.cxx.

References GetId(), lar_content::LArPfoHelper::GetParentPfo(), and detinfo::sampling_rate().

Referenced by BuildT0s().

1156  {
1157  const pandora::ParticleFlowObject* const pParent(lar_content::LArPfoHelper::GetParentPfo(pPfo));
1158  const float x0(pParent->GetPropertiesMap().count("X0") ? pParent->GetPropertiesMap().at("X0") :
1159  0.f);
1160 
1161  auto const clock_data = art::ServiceHandle<detinfo::DetectorClocksService const>()->DataFor(e);
1162  auto const det_prop =
1164  const double cm_per_tick(det_prop.GetXTicksCoefficient());
1165  const double ns_per_tick(sampling_rate(clock_data));
1166 
1167  // ATTN: T0 values are currently calculated in nanoseconds relative to the trigger offset. Only non-zero values are outputted.
1168  const double T0(x0 * ns_per_tick / cm_per_tick);
1169 
1170  if (std::fabs(T0) <= std::numeric_limits<double>::epsilon()) return false;
1171 
1172  // Output T0 objects [arguments are: time (nanoseconds); trigger type (3 for TPC stitching!); pfparticle SelfID code; T0 ID code]
1173  t0 = anab::T0(T0, 3, LArPandoraOutput::GetId(pPfo, pfoVector), nextId++);
1174 
1175  return true;
1176  }
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&#39;t exist...
Definition: T0.h:16
static const pandora::ParticleFlowObject * GetParentPfo(const pandora::ParticleFlowObject *const pPfo)
Get the primary parent pfo.
Float_t e
Definition: plot.C:35
double sampling_rate(DetectorClocksData const &data)
Returns the period of the TPC readout electronics clock.
void lar_pandora::LArPandoraOutput::BuildT0s ( const art::Event event,
const std::string &  instanceLabel,
const pandora::PfoVector &  pfoVector,
T0Collection outputT0s,
PFParticleToT0Collection outputParticlesToT0s 
)
static

Calculate the T0 of each pfos and add them to the output vector Create the associations between PFParticle and T0s.

Parameters
eventthe art event
instanceLabelthe label for the collections to be produced
pfoVectorthe input list of pfos
outputT0sthe output vector of T0s
outputParticlesToT0sthe output associations between PFParticles and T0s

Definition at line 913 of file LArPandoraOutput.cxx.

References AddAssociation(), and BuildT0().

Referenced by ProduceArtOutput().

918  {
919  size_t nextT0Id(0);
920  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
921  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
922 
923  anab::T0 t0;
924  if (!LArPandoraOutput::BuildT0(event, pPfo, pfoVector, nextT0Id, t0)) continue;
925 
927  event, instanceLabel, pfoId, nextT0Id - 1, outputParticlesToT0s);
928  outputT0s->push_back(t0);
929  }
930  }
code to link reconstructed objects back to the MC truth information
Definition: T0.h:16
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.
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.
recob::Vertex lar_pandora::LArPandoraOutput::BuildVertex ( const pandora::Vertex *const  pVertex,
const size_t  vertexId 
)
static

Convert from a pandora vertex to an ART vertex.

Parameters
pVertexthe input vertex
vertexIdthe id of the vertex to produce
theART vertex

Definition at line 960 of file LArPandoraOutput.cxx.

Referenced by BuildVertices().

962  {
963  double pos[3] = {
964  pVertex->GetPosition().GetX(), pVertex->GetPosition().GetY(), pVertex->GetPosition().GetZ()};
965  return recob::Vertex(pos, vertexId);
966  }
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
void lar_pandora::LArPandoraOutput::BuildVertices ( const pandora::VertexVector &  vertexVector,
VertexCollection outputVertices 
)
static

Convert pandora vertices to ART vertices and add them to the output vector.

Parameters
vertexVectorthe input list of pandora vertices
outputVerticesthe output vector of ART vertices

Definition at line 577 of file LArPandoraOutput.cxx.

References BuildVertex().

Referenced by ProduceArtOutput().

579  {
580  for (size_t vertexId = 0; vertexId < vertexVector.size(); ++vertexId)
581  outputVertices->push_back(LArPandoraOutput::BuildVertex(vertexVector.at(vertexId), vertexId));
582  }
static recob::Vertex BuildVertex(const pandora::Vertex *const pVertex, const size_t vertexId)
Convert from a pandora vertex to an ART vertex.
void lar_pandora::LArPandoraOutput::Collect3DHits ( const pandora::ParticleFlowObject *const  pPfo,
pandora::CaloHitVector &  caloHits 
)
static

Collect a sorted vector of all 3D hits in the input pfo.

Parameters
pPfothe input pfo
caloHitsthe sorted output vector of 3D hits

Definition at line 489 of file LArPandoraOutput.cxx.

References lar_content::LArPfoHelper::GetCaloHits(), and lar_content::LArClusterHelper::SortHitsByPosition().

Referenced by Collect3DHits(), and ProduceArtOutput().

491  {
492  // Get the sorted list of 3D hits associated with the pfo
493  pandora::CaloHitList threeDHits;
494  lar_content::LArPfoHelper::GetCaloHits(pPfo, pandora::TPC_3D, threeDHits);
495 
496  caloHits.insert(caloHits.end(), threeDHits.begin(), threeDHits.end());
497  std::sort(caloHits.begin(), caloHits.end(), lar_content::LArClusterHelper::SortHitsByPosition);
498  }
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 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.
pandora::CaloHitList lar_pandora::LArPandoraOutput::Collect3DHits ( const pandora::PfoVector &  pfoVector,
IdToIdVectorMap pfoToThreeDHitsMap 
)
static

Collect a sorted list of all 3D hits contained in the input pfo list Order is guaranteed provided pfoVector is ordered.

Parameters
pfoVectorthe input list of pfos
pfoToThreeDHitsMapthe output mapping from pfo ID to 3D hit IDs
Returns
the list of 3D hits collected

Definition at line 457 of file LArPandoraOutput.cxx.

References Collect3DHits().

459  {
460  pandora::CaloHitList caloHitList;
461 
462  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
463  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
464 
465  if (!pfoToThreeDHitsMap.insert(IdToIdVectorMap::value_type(pfoId, {})).second)
466  throw cet::exception("LArPandora")
467  << " LArPandoraOutput::Collect3DHits --- repeated pfos in input list ";
468 
469  pandora::CaloHitVector sorted3DHits;
470  LArPandoraOutput::Collect3DHits(pPfo, sorted3DHits);
471 
472  for (const pandora::CaloHit* const pCaloHit3D : sorted3DHits) {
473  if (pandora::TPC_3D !=
474  pCaloHit3D
475  ->GetHitType()) // TODO decide if this is required, or should I just insert them?
476  throw cet::exception("LArPandora")
477  << " LArPandoraOutput::Collect3DHits --- found a 2D hit in a 3D cluster";
478 
479  pfoToThreeDHitsMap.at(pfoId).push_back(caloHitList.size());
480  caloHitList.push_back(pCaloHit3D);
481  }
482  }
483 
484  return caloHitList;
485  }
static void Collect3DHits(const pandora::ParticleFlowObject *const pPfo, pandora::CaloHitVector &caloHits)
Collect a sorted vector of all 3D hits in the input pfo.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
pandora::PfoVector lar_pandora::LArPandoraOutput::CollectAllPfoOutcomes ( const pandora::Pandora *const  pPrimaryPandora)
static

Collect the pfos (including all downstream pfos) from the master and daughter pandora instances.

Parameters
pPrimaryPandoraaddress of master pandora instance
Returns
a sorted list of all pfos to convert to ART PFParticles

Definition at line 265 of file LArPandoraOutput.cxx.

References CollectPfos(), GetPandoraInstance(), GetPandoraSlices(), IsClearCosmic(), and util::to_string().

Referenced by ProduceArtOutput().

267  {
268  pandora::PfoList collectedPfos;
269 
270  // Get the list of slice pfos - one per slice
271  pandora::PfoVector slicePfos;
272  LArPandoraOutput::GetPandoraSlices(pPrimaryPandora, slicePfos);
273 
274  // Identify the pandora worker instances by their name
275  const pandora::Pandora* pSliceNuWorker(nullptr);
276  if (!LArPandoraOutput::GetPandoraInstance(pPrimaryPandora, "SliceNuWorker", pSliceNuWorker))
277  throw cet::exception("LArPandora")
278  << " LArPandoraOutput::CollectAllPfoOutcomes--- Can't find slice nu worker instance. ";
279 
280  const pandora::Pandora* pSliceCRWorker(nullptr);
281  if (!LArPandoraOutput::GetPandoraInstance(pPrimaryPandora, "SliceCRWorker", pSliceCRWorker))
282  throw cet::exception("LArPandora")
283  << " LArPandoraOutput::CollectAllPfoOutcomes--- Can't find slice CR worker instance. ";
284 
285  // Collect slices under both reconstruction hypotheses
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());
292 
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());
298  }
299 
300  // Get the list of the parent pfos from the primary pandora instance
301  const pandora::PfoList* pParentPfoList(nullptr);
302  PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
303  !=,
304  PandoraApi::GetCurrentPfoList(*pPrimaryPandora, pParentPfoList));
305 
306  // Collect clear cosmic-rays
307  for (const pandora::ParticleFlowObject* const pPfo : *pParentPfoList) {
308  if (LArPandoraOutput::IsClearCosmic(pPfo)) collectedPfos.push_back(pPfo);
309  }
310 
311  // Collect all pfos that are downstream of the parents we have collected
312  pandora::PfoVector pfoVector;
313  LArPandoraOutput::CollectPfos(collectedPfos, pfoVector);
314 
315  return pfoVector;
316  }
static void GetPandoraSlices(const pandora::Pandora *const pPrimaryPandora, pandora::PfoVector &slicePfos)
Get the slice pfos - one pfo per slice.
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.
decltype(auto) constexpr to_string(T &&obj)
ADL-aware version of std::to_string.
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.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
pandora::ClusterList lar_pandora::LArPandoraOutput::CollectClusters ( const pandora::PfoVector &  pfoVector,
IdToIdVectorMap pfoToClustersMap 
)
static

Collect a sorted list of all 2D clusters contained in the input pfo list Order is guaranteed provided pfoVector is ordered.

Parameters
pfoVectorthe input list of pfos
pfoToClustersMapthe output mapping from pfo ID to cluster IDs
Returns
the list of clusters collected

Definition at line 428 of file LArPandoraOutput.cxx.

References lar_content::LArPfoHelper::GetTwoDClusterList(), and lar_content::LArClusterHelper::SortByNHits().

Referenced by ProduceArtOutput().

430  {
431  pandora::ClusterList clusterList;
432 
433  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
434  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
435 
436  // Get the sorted list of clusters from the pfo
437  pandora::ClusterList clusters;
440 
441  // Get incrementing id's for each cluster
442  IdVector clusterIds(clusters.size());
443  std::iota(clusterIds.begin(), clusterIds.end(), clusterList.size());
444 
445  clusterList.insert(clusterList.end(), clusters.begin(), clusters.end());
446 
447  if (!pfoToClustersMap.insert(IdToIdVectorMap::value_type(pfoId, clusterIds)).second)
448  throw cet::exception("LArPandora")
449  << " LArPandoraOutput::CollectClusters --- repeated pfos in input list ";
450  }
451 
452  return clusterList;
453  }
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 void GetTwoDClusterList(const pandora::ParticleFlowObject *const pPfo, pandora::ClusterList &clusterList)
Get the list of 2D clusters from an input pfo.
std::vector< size_t > IdVector
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
pandora::PfoVector lar_pandora::LArPandoraOutput::CollectPfos ( const pandora::Pandora *const  pPrimaryPandora)
static

Collect the current pfos (including all downstream pfos) from the master pandora instance.

Parameters
pPrimaryPandoraaddress of master pandora instance
Returns
a sorted list of all pfos to convert to ART PFParticles

Definition at line 360 of file LArPandoraOutput.cxx.

Referenced by CollectAllPfoOutcomes(), and ProduceArtOutput().

361  {
362  const pandora::PfoList* pParentPfoList(nullptr);
363  PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
364  !=,
365  PandoraApi::GetCurrentPfoList(*pPrimaryPandora, pParentPfoList));
366 
367  pandora::PfoVector pfoVector;
368  LArPandoraOutput::CollectPfos(*pParentPfoList, pfoVector);
369 
370  return pfoVector;
371  }
static pandora::PfoVector CollectPfos(const pandora::Pandora *const pPrimaryPandora)
Collect the current pfos (including all downstream pfos) from the master pandora instance.
void lar_pandora::LArPandoraOutput::CollectPfos ( const pandora::PfoList &  parentPfoList,
pandora::PfoVector &  pfoVector 
)
static

Collect a sorted list of all downstream pfos of an input list of parent.

Parameters
parentPfoListthe input list of parent pfos
pfoVectorthe sorted output list of all downstream pfos

Definition at line 375 of file LArPandoraOutput.cxx.

References lar_content::LArPfoHelper::GetAllConnectedPfos(), and lar_content::LArPfoHelper::SortByNHits().

377  {
378  if (!pfoVector.empty())
379  throw cet::exception("LArPandora")
380  << " LArPandoraOutput::CollectPfos--- trying to collect pfos into a non-empty list ";
381 
382  pandora::PfoList pfoList;
383  lar_content::LArPfoHelper::GetAllConnectedPfos(parentPfoList, pfoList);
384 
385  pfoVector.insert(pfoVector.end(), pfoList.begin(), pfoList.end());
386  std::sort(pfoVector.begin(), pfoVector.end(), lar_content::LArPfoHelper::SortByNHits);
387  }
static bool SortByNHits(const pandora::ParticleFlowObject *const pLhs, const pandora::ParticleFlowObject *const pRhs)
Sort pfos by number of constituent hits.
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...
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
pandora::VertexVector lar_pandora::LArPandoraOutput::CollectVertices ( const pandora::PfoVector &  pfoVector,
IdToIdVectorMap pfoToVerticesMap,
std::function< const pandora::Vertex *const (const pandora::ParticleFlowObject *const)>  fCriteria 
)
static

Collect all vertices contained in the input pfo list Order is guaranteed provided pfoVector is ordered.

Parameters
pfoVectorthe input list of pfos
pfoToVerticesMapthe output mapping from pfo ID to vertex IDs (zero or one)
fCriteriafunction to extract vertex from pfo
Returns
the list of vertices collected

Definition at line 391 of file LArPandoraOutput.cxx.

Referenced by ProduceArtOutput().

395  {
396  pandora::VertexVector vertexVector;
397 
398  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
399  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
400 
401  if (pPfo->GetVertexList().empty()) continue;
402 
403  try {
404  const pandora::Vertex* const pVertex(fCriteria(pPfo));
405 
406  // Get the vertex ID and add it to the vertex list if required
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());
411 
412  if (!isInList) vertexVector.push_back(pVertex);
413 
414  if (!pfoToVerticesMap.insert(IdToIdVectorMap::value_type(pfoId, {vertexId})).second)
415  throw cet::exception("LArPandora")
416  << " LArPandoraOutput::CollectVertices --- repeated pfos in input list ";
417  }
418  catch (const pandora::StatusCodeException&) {
419  continue;
420  }
421  }
422 
423  return vertexVector;
424  }
std::vector< art::Ptr< recob::Vertex > > VertexVector
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
void lar_pandora::LArPandoraOutput::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 
)
static

Ouput a single slice containing all of the input hits.

Parameters
settingsthe settings
eventthe art event
instanceLabelthe label for the collections to be produced
pfoVectorthe input vector of all pfos to be output
idToHitMapinput mapping from pandora hit ID to ART hit
outputSlicesthe output collection of slices to populate
outputParticlesToSlicesthe output association from particles to slices
outputSlicesToHitsthe output association from slices to hits

Definition at line 845 of file LArPandoraOutput.cxx.

References AddAssociation(), BuildDummySlice(), lar_pandora::LArPandoraHelper::CollectHits(), hits(), and lar_pandora::LArPandoraOutput::Settings::m_hitfinderModuleLabel.

Referenced by BuildSlices().

854  {
855  const unsigned int sliceIndex(LArPandoraOutput::BuildDummySlice(outputSlices));
856 
857  // Add all of the hits in the events to the slice
858  HitVector hits;
859  LArPandoraHelper::CollectHits(event, settings.m_hitfinderModuleLabel, hits);
860  LArPandoraOutput::AddAssociation(event, instanceLabel, sliceIndex, hits, outputSlicesToHits);
861 
862  mf::LogDebug("LArPandora") << "Finding hits with label: " << settings.m_hitfinderModuleLabel
863  << std::endl;
864  mf::LogDebug("LArPandora") << " - Found " << hits.size() << std::endl;
865  mf::LogDebug("LArPandora") << " - Making associations " << outputSlicesToHits->size()
866  << std::endl;
867 
868  // Add all of the PFOs to the slice
869  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId)
871  event, instanceLabel, pfoId, sliceIndex, outputParticlesToSlices);
872  }
static unsigned int BuildDummySlice(SliceCollection &outputSlices)
Build a new slice object with dummy information.
void hits()
Definition: readHits.C:15
static void CollectHits(const art::Event &evt, const std::string &label, HitVector &hitVector)
Collect the reconstructed Hits from the ART event record.
std::vector< art::Ptr< recob::Hit > > HitVector
MaybeLogger_< ELseverityLevel::ELsev_success, false > LogDebug
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.
art::Ptr< recob::Hit > lar_pandora::LArPandoraOutput::GetHit ( const IdToHitMap idToHitMap,
const pandora::CaloHit *const  pCaloHit 
)
static

Look up ART hit from an input Pandora hit.

Parameters
idToHitMapthe mapping between Pandora and ART hits
pCaloHitthe input Pandora hit (2D)

Definition at line 545 of file LArPandoraOutput.cxx.

Referenced by BuildSlice(), and GetPandoraToArtHitMap().

547  {
548  // TODO make this less evil
549 
550  // ATTN The CaloHit can come from the primary pandora instance (depth = 0) or one of its daughers (depth = 1).
551  // Here we keep trying to access the ART hit increasing the depth step-by-step
552  for (unsigned int depth = 0, maxDepth = 2; depth < maxDepth; ++depth) {
553  // Navigate to the hit address in the pandora master instance (assuming the depth is correct)
554  const pandora::CaloHit* pParentCaloHit = pCaloHit;
555  for (unsigned int i = 0; i < depth; ++i)
556  pParentCaloHit = static_cast<const pandora::CaloHit*>(pCaloHit->GetParentAddress());
557 
558  // Attempt to find the mapping from the "parent" calo hit to the ART hit
559  const void* const pHitAddress(pParentCaloHit->GetParentAddress());
560  const intptr_t hitID_temp((intptr_t)(pHitAddress));
561  const int hitID((int)(hitID_temp));
562 
563  IdToHitMap::const_iterator artIter = idToHitMap.find(hitID);
564 
565  // If there is no such mapping from "parent" calo hit to the ART hit, then increase the depth and try again!
566  if (idToHitMap.end() == artIter) continue;
567 
568  return artIter->second;
569  }
570 
571  throw cet::exception("LArPandora")
572  << " LArPandoraOutput::GetHit --- found a Pandora hit without a parent ART hit ";
573  }
intermediate_table::const_iterator const_iterator
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
void lar_pandora::LArPandoraOutput::GetHitsInCluster ( const pandora::Cluster *const  pCluster,
pandora::CaloHitVector &  sortedHits 
)
static

Collect a sorted list of all 2D hits in a cluster.

Parameters
pClusterthe input cluster
sortedHitsthe output vector of sorted 2D hits

Definition at line 970 of file LArPandoraOutput.cxx.

References lar_content::LArClusterHelper::SortHitsByPosition().

Referenced by BuildClusters(), and GetPandoraToArtHitMap().

972  {
973  if (!sortedHits.empty())
974  throw cet::exception("LArPandora")
975  << " LArPandoraOutput::GetHitsInCluster --- vector to hold hits is not empty ";
976 
977  pandora::CaloHitList hitList;
978  pCluster->GetOrderedCaloHitList().FillCaloHitList(hitList);
979  hitList.insert(hitList.end(),
980  pCluster->GetIsolatedCaloHitList().begin(),
981  pCluster->GetIsolatedCaloHitList().end());
982 
983  sortedHits.insert(sortedHits.end(), hitList.begin(), hitList.end());
984  std::sort(
985  sortedHits.begin(), sortedHits.end(), lar_content::LArClusterHelper::SortHitsByPosition);
986  }
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)
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
template<typename T >
size_t lar_pandora::LArPandoraOutput::GetId ( const T *const  pT,
const std::list< const T * > &  tList 
)
inlinestatic

Find the index of an input object in an input list. Throw an exception if it doesn't exist.

Parameters
pTthe input object for which the ID should be found
tLista list of objects of type pT to query
Returns
the ID of the input object

Definition at line 624 of file LArPandoraOutput.h.

Referenced by BuildClusters(), BuildPFParticle(), and BuildT0().

625  {
626  typename std::list<const T*>::const_iterator it(std::find(tList.begin(), tList.end(), pT));
627 
628  if (it == tList.end())
629  throw cet::exception("LArPandora")
630  << " LArPandoraOutput::GetId --- can't find the id of supplied object";
631 
632  return static_cast<size_t>(std::distance(tList.begin(), it));
633  }
intermediate_table::const_iterator const_iterator
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
template<typename T >
size_t lar_pandora::LArPandoraOutput::GetId ( const T *const  pT,
const std::vector< const T * > &  tVector 
)
inlinestatic

Find the index of an input object in an input vector. Throw an exception if it doesn't exist.

Parameters
pTthe input object for which the ID should be found
tVectora list of objects of type pT to query
Returns
the ID of the input object

Definition at line 638 of file LArPandoraOutput.h.

639  {
641  std::find(tVector.begin(), tVector.end(), pT));
642 
643  if (it == tVector.end())
644  throw cet::exception("LArPandora")
645  << " LArPandoraOutput::GetId --- can't find the id of supplied object";
646 
647  return static_cast<size_t>(std::distance(tVector.begin(), it));
648  }
intermediate_table::const_iterator const_iterator
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
bool lar_pandora::LArPandoraOutput::GetPandoraInstance ( const pandora::Pandora *const  pPrimaryPandora,
const std::string &  name,
const pandora::Pandora *&  pPandoraInstance 
)
static

Get the address of a pandora instance with a given name.

Parameters
pPrimaryPandorathe primary pandora instance
namethe name of the instance to collect
pPandoraInstancethe output address of the pandora instance requested
Returns
if the pandora instance could be found

Definition at line 213 of file LArPandoraOutput.cxx.

References MultiPandoraApi::GetDaughterPandoraInstanceList().

Referenced by CollectAllPfoOutcomes(), and GetPandoraSlices().

216  {
217  if (!pPrimaryPandora)
218  throw cet::exception("LArPandora") << " LArPandoraOutput::GetPandoraInstance--- input "
219  "primary pandora instance address is invalid ";
220 
221  if (pPandoraInstance)
222  throw cet::exception("LArPandora") << " LArPandoraOutput::GetPandoraInstance--- the input "
223  "pandora instance address is non-null ";
224 
225  for (const pandora::Pandora* const pPandora :
227  if (pPandora->GetName() != name) continue;
228 
229  if (pPandoraInstance)
230  throw cet::exception("LArPandora")
231  << " LArPandoraOutput::GetPandoraInstance--- found multiple pandora instances with name: "
232  << name;
233 
234  pPandoraInstance = pPandora;
235  }
236 
237  return static_cast<bool>(pPandoraInstance);
238  }
static const PandoraInstanceList & GetDaughterPandoraInstanceList(const pandora::Pandora *const pPrimaryPandora)
Get the list of daughter pandora instances associated with a given primary pandora instance...
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
void lar_pandora::LArPandoraOutput::GetPandoraSlices ( const pandora::Pandora *const  pPrimaryPandora,
pandora::PfoVector &  slicePfos 
)
static

Get the slice pfos - one pfo per slice.

Parameters
pPrimaryPandorathe primary pandora instance
slicePfosthe output vector of slice pfos

Definition at line 242 of file LArPandoraOutput.cxx.

References GetPandoraInstance().

Referenced by BuildSlices(), and CollectAllPfoOutcomes().

244  {
245  if (!slicePfos.empty())
246  throw cet::exception("LArPandora")
247  << " LArPandoraOutput::GetPandoraSlices--- Input slicePfo vector is not empty ";
248 
249  // Get the pandora slicing worker - if it exists
250  const pandora::Pandora* pSlicingWorker(nullptr);
251  if (!LArPandoraOutput::GetPandoraInstance(pPrimaryPandora, "SlicingWorker", pSlicingWorker))
252  return;
253 
254  // Get the slice PFOs - one PFO per slice
255  const pandora::PfoList* pSlicePfoList(nullptr);
256  PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
257  !=,
258  PandoraApi::GetCurrentPfoList(*pSlicingWorker, pSlicePfoList));
259 
260  slicePfos.insert(slicePfos.end(), pSlicePfoList->begin(), pSlicePfoList->end());
261  }
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.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
void lar_pandora::LArPandoraOutput::GetPandoraToArtHitMap ( const pandora::ClusterList &  clusterList,
const pandora::CaloHitList &  threeDHitList,
const IdToHitMap idToHitMap,
CaloHitToArtHitMap pandoraHitToArtHitMap 
)
static

Collect all 2D and 3D hits that were used / produced in the reconstruction and map them to their corresponding ART hit.

Parameters
clusterListinput list of all 2D clusters to be output
threeDHitListinput list of all 3D hits to be output (as spacepoints)
idToHitMapinput mapping from pandora hit ID to ART hit
pandoraHitToArtHitMapoutput mapping from pandora hit to ART hit

Definition at line 502 of file LArPandoraOutput.cxx.

References lar_content::LArClusterHelper::GetClusterHitType(), GetHit(), and GetHitsInCluster().

Referenced by ProduceArtOutput().

506  {
507  // Collect 2D hits from clusters
508  for (const pandora::Cluster* const pCluster : clusterList) {
509  if (pandora::TPC_3D == lar_content::LArClusterHelper::GetClusterHitType(pCluster))
510  throw cet::exception("LArPandora")
511  << " LArPandoraOutput::GetPandoraToArtHitMap --- found a 3D input cluster ";
512 
513  pandora::CaloHitVector sortedHits;
514  LArPandoraOutput::GetHitsInCluster(pCluster, sortedHits);
515 
516  for (const pandora::CaloHit* const pCaloHit : sortedHits) {
517  if (!pandoraHitToArtHitMap
518  .insert(CaloHitToArtHitMap::value_type(
519  pCaloHit, LArPandoraOutput::GetHit(idToHitMap, pCaloHit)))
520  .second)
521  throw cet::exception("LArPandora")
522  << " LArPandoraOutput::GetPandoraToArtHitMap --- found repeated input hits ";
523  }
524  }
525 
526  for (const pandora::CaloHit* const pCaloHit : threeDHitList) {
527  if (pCaloHit->GetHitType() != pandora::TPC_3D)
528  throw cet::exception("LArPandora")
529  << " LArPandoraOutput::GetPandoraToArtHitMap --- found a non-3D hit in the input list ";
530 
531  // ATTN get the 2D calo hit from the 3D calo hit then find the art hit!
532  if (!pandoraHitToArtHitMap
533  .insert(CaloHitToArtHitMap::value_type(
534  pCaloHit,
536  idToHitMap, static_cast<const pandora::CaloHit*>(pCaloHit->GetParentAddress()))))
537  .second)
538  throw cet::exception("LArPandora")
539  << " LArPandoraOutput::GetPandoraToArtHitMap --- found repeated input hits ";
540  }
541  }
static void GetHitsInCluster(const pandora::Cluster *const pCluster, pandora::CaloHitVector &sortedHits)
Collect a sorted list of all 2D hits in a cluster.
static art::Ptr< recob::Hit > GetHit(const IdToHitMap &idToHitMap, const pandora::CaloHit *const pCaloHit)
Look up ART hit from an input Pandora hit.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
second_as<> second
Type of time stored in seconds, in double precision.
Definition: spacetime.h:82
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
unsigned int lar_pandora::LArPandoraOutput::GetSliceIndex ( const pandora::ParticleFlowObject *const  pPfo)
static

Get the index of the slice from which this pfo was produced.

Parameters
pPfothe input pfo
Returns
the slice index

Definition at line 344 of file LArPandoraOutput.cxx.

References lar_content::LArPfoHelper::GetParentPfo().

Referenced by BuildSlices().

345  {
346  const pandora::ParticleFlowObject* const pParent(lar_content::LArPfoHelper::GetParentPfo(pPfo));
347 
348  const auto& properties(pParent->GetPropertiesMap());
349  const auto it(properties.find("SliceIndex"));
350 
351  if (it == properties.end())
352  throw cet::exception("LArPandora")
353  << " LArPandoraOutput::GetSliceIndex--- Input PFO was not from a slice ";
354 
355  return static_cast<unsigned int>(std::round(it->second));
356  }
static const pandora::ParticleFlowObject * GetParentPfo(const pandora::ParticleFlowObject *const pPfo)
Get the primary parent pfo.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
bool lar_pandora::LArPandoraOutput::IsClearCosmic ( const pandora::ParticleFlowObject *const  pPfo)
static

Check if the input pfo is an unambiguous cosmic ray.

Parameters
pPfothe input pfo
Returns
if the input pfo is a clear cosmic ray

Definition at line 320 of file LArPandoraOutput.cxx.

References lar_content::LArPfoHelper::GetParentPfo().

Referenced by CollectAllPfoOutcomes().

321  {
322  const pandora::ParticleFlowObject* const pParent(lar_content::LArPfoHelper::GetParentPfo(pPfo));
323 
324  const auto& properties(pParent->GetPropertiesMap());
325  const auto it(properties.find("IsClearCosmic"));
326 
327  if (it == properties.end()) return false;
328 
329  return static_cast<bool>(std::round(it->second));
330  }
static const pandora::ParticleFlowObject * GetParentPfo(const pandora::ParticleFlowObject *const pPfo)
Get the primary parent pfo.
bool lar_pandora::LArPandoraOutput::IsFromSlice ( const pandora::ParticleFlowObject *const  pPfo)
static

Check if the input pfo is from a slice.

Parameters
pPfothe input pfo
Returns
if the input pfo is from a slice

Definition at line 334 of file LArPandoraOutput.cxx.

References lar_content::LArPfoHelper::GetParentPfo().

Referenced by BuildSlices().

335  {
336  const pandora::ParticleFlowObject* const pParent(lar_content::LArPfoHelper::GetParentPfo(pPfo));
337 
338  const auto& properties(pParent->GetPropertiesMap());
339  return (properties.find("SliceIndex") != properties.end());
340  }
static const pandora::ParticleFlowObject * GetParentPfo(const pandora::ParticleFlowObject *const pPfo)
Get the primary parent pfo.
void lar_pandora::LArPandoraOutput::ProduceArtOutput ( const Settings settings,
const IdToHitMap idToHitMap,
art::Event evt 
)
static

Convert the Pandora PFOs into ART clusters and write into ART event.

Parameters
settingsthe settings
idToHitMapthe mapping from Pandora hit ID to ART hit
evtthe ART event

Definition at line 41 of file LArPandoraOutput.cxx.

References AssociateAdditionalVertices(), BuildClusters(), BuildParticleMetadata(), BuildPFParticles(), BuildSlices(), BuildSpacePoints(), BuildT0s(), BuildVertices(), Collect3DHits(), CollectAllPfoOutcomes(), CollectClusters(), CollectPfos(), CollectVertices(), GetPandoraToArtHitMap(), lar_content::LArPfoHelper::GetTestBeamInteractionVertex(), lar_content::LArPfoHelper::GetVertex(), lar_pandora::LArPandoraOutput::Settings::m_allOutcomesInstanceLabel, lar_pandora::LArPandoraOutput::Settings::m_pPrimaryPandora, lar_pandora::LArPandoraOutput::Settings::m_shouldProduceAllOutcomes, lar_pandora::LArPandoraOutput::Settings::m_shouldProduceSlices, lar_pandora::LArPandoraOutput::Settings::m_shouldProduceTestBeamInteractionVertices, lar_pandora::LArPandoraOutput::Settings::m_shouldRunStitching, lar_pandora::LArPandoraOutput::Settings::m_testBeamInteractionVerticesInstanceLabel, art::Event::put(), and lar_pandora::LArPandoraOutput::Settings::Validate().

Referenced by lar_pandora::LArPandora::ProcessPandoraOutput().

44  {
45  settings.Validate();
46  const std::string instanceLabel(
47  settings.m_shouldProduceAllOutcomes ? settings.m_allOutcomesInstanceLabel : "");
48  const std::string testBeamInteractionVertexInstanceLabel(
49  instanceLabel + settings.m_testBeamInteractionVerticesInstanceLabel);
50 
51  // Set up mandatory output collections
52  PFParticleCollection outputParticles(new std::vector<recob::PFParticle>);
53  VertexCollection outputVertices(new std::vector<recob::Vertex>);
54  ClusterCollection outputClusters(new std::vector<recob::Cluster>);
55  SpacePointCollection outputSpacePoints(new std::vector<recob::SpacePoint>);
56  PFParticleMetadataCollection outputParticleMetadata(
57  new std::vector<larpandoraobj::PFParticleMetadata>);
58 
59  // Set up optional output collections
60  VertexCollection outputTestBeamInteractionVertices(
61  settings.m_shouldProduceTestBeamInteractionVertices ? new std::vector<recob::Vertex> :
62  nullptr);
63  T0Collection outputT0s(settings.m_shouldRunStitching ? new std::vector<anab::T0> : nullptr);
64  SliceCollection outputSlices(settings.m_shouldProduceSlices ? new std::vector<recob::Slice> :
65  nullptr);
66 
67  // Set up mandatory output associations
68  PFParticleToMetadataCollection outputParticlesToMetadata(
70  PFParticleToSpacePointCollection outputParticlesToSpacePoints(
72  PFParticleToClusterCollection outputParticlesToClusters(
74  PFParticleToVertexCollection outputParticlesToVertices(
77  SpacePointToHitCollection outputSpacePointsToHits(
80 
81  // Set up optional output associations
82  PFParticleToVertexCollection outputParticlesToTestBeamInteractionVertices(
83  settings.m_shouldProduceTestBeamInteractionVertices ?
85  nullptr);
86  PFParticleToT0Collection outputParticlesToT0s(
87  settings.m_shouldRunStitching ? new art::Assns<recob::PFParticle, anab::T0> : nullptr);
88  PFParticleToSliceCollection outputParticlesToSlices(
89  settings.m_shouldProduceSlices ? new art::Assns<recob::PFParticle, recob::Slice> : nullptr);
90 
91  // Collect immutable lists of pandora collections that we should convert to ART format
92  const pandora::PfoVector pfoVector(
93  settings.m_shouldProduceAllOutcomes ?
94  LArPandoraOutput::CollectAllPfoOutcomes(settings.m_pPrimaryPandora) :
95  LArPandoraOutput::CollectPfos(settings.m_pPrimaryPandora));
96 
97  IdToIdVectorMap pfoToVerticesMap, pfoToTestBeamInteractionVerticesMap;
99  pfoVector, pfoToVerticesMap, lar_content::LArPfoHelper::GetVertex));
100  const pandora::VertexVector testBeamInteractionVertexVector(
101  settings.m_shouldProduceTestBeamInteractionVertices ?
103  pfoToTestBeamInteractionVerticesMap,
106 
107  IdToIdVectorMap pfoToClustersMap;
108  const pandora::ClusterList clusterList(
109  LArPandoraOutput::CollectClusters(pfoVector, pfoToClustersMap));
110 
111  IdToIdVectorMap pfoToThreeDHitsMap;
112  const pandora::CaloHitList threeDHitList(
113  LArPandoraOutput::Collect3DHits(pfoVector, pfoToThreeDHitsMap));
114 
115  // Get mapping from pandora hits to art hits
116  CaloHitToArtHitMap pandoraHitToArtHitMap;
118  clusterList, threeDHitList, idToHitMap, pandoraHitToArtHitMap);
119 
120  // Build the ART outputs from the pandora objects
121  LArPandoraOutput::BuildVertices(vertexVector, outputVertices);
122 
123  if (settings.m_shouldProduceTestBeamInteractionVertices)
124  LArPandoraOutput::BuildVertices(testBeamInteractionVertexVector,
125  outputTestBeamInteractionVertices);
126 
128  instanceLabel,
129  threeDHitList,
130  pandoraHitToArtHitMap,
131  outputSpacePoints,
132  outputSpacePointsToHits);
133 
134  IdToIdVectorMap pfoToArtClustersMap;
136  instanceLabel,
137  clusterList,
138  pandoraHitToArtHitMap,
139  pfoToClustersMap,
140  outputClusters,
141  outputClustersToHits,
142  pfoToArtClustersMap);
143 
145  instanceLabel,
146  pfoVector,
147  pfoToVerticesMap,
148  pfoToThreeDHitsMap,
149  pfoToArtClustersMap,
150  outputParticles,
151  outputParticlesToVertices,
152  outputParticlesToSpacePoints,
153  outputParticlesToClusters);
154 
156  evt, instanceLabel, pfoVector, outputParticleMetadata, outputParticlesToMetadata);
157 
158  if (settings.m_shouldProduceSlices)
160  settings.m_pPrimaryPandora,
161  evt,
162  instanceLabel,
163  pfoVector,
164  idToHitMap,
165  outputSlices,
166  outputParticlesToSlices,
167  outputSlicesToHits);
168 
169  if (settings.m_shouldRunStitching)
170  LArPandoraOutput::BuildT0s(evt, instanceLabel, pfoVector, outputT0s, outputParticlesToT0s);
171 
172  if (settings.m_shouldProduceTestBeamInteractionVertices)
174  instanceLabel,
175  pfoVector,
176  pfoToTestBeamInteractionVerticesMap,
177  outputParticlesToTestBeamInteractionVertices);
178 
179  // Add the outputs to the event
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);
185 
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);
193 
194  if (settings.m_shouldProduceTestBeamInteractionVertices) {
195  evt.put(std::move(outputTestBeamInteractionVertices), testBeamInteractionVertexInstanceLabel);
196  evt.put(std::move(outputParticlesToTestBeamInteractionVertices),
197  testBeamInteractionVertexInstanceLabel);
198  }
199 
200  if (settings.m_shouldRunStitching) {
201  evt.put(std::move(outputT0s), instanceLabel);
202  evt.put(std::move(outputParticlesToT0s), instanceLabel);
203  }
204 
205  if (settings.m_shouldProduceSlices) {
206  evt.put(std::move(outputSlices), instanceLabel);
207  evt.put(std::move(outputSlicesToHits), instanceLabel);
208  }
209  }
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...
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...
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 ...
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
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::map< size_t, IdVector > IdToIdVectorMap
std::unique_ptr< art::Assns< recob::PFParticle, larpandoraobj::PFParticleMetadata > > PFParticleToMetadataCollection
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::unique_ptr< art::Assns< recob::Slice, recob::Hit > > SliceToHitCollection
PutHandle< PROD > put(std::unique_ptr< PROD > &&edp, std::string const &instance={})
Definition: Event.h:77
std::unique_ptr< art::Assns< recob::PFParticle, anab::T0 > > PFParticleToT0Collection
static void BuildVertices(const pandora::VertexVector &vertexVector, VertexCollection &outputVertices)
Convert pandora vertices to ART vertices and add them to the output vector.
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.
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
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...
std::unique_ptr< art::Assns< recob::PFParticle, recob::SpacePoint > > PFParticleToSpacePointCollection
std::unique_ptr< std::vector< anab::T0 > > T0Collection
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.
std::vector< art::Ptr< recob::Vertex > > VertexVector
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
static pandora::PfoVector CollectAllPfoOutcomes(const pandora::Pandora *const pPrimaryPandora)
Collect the pfos (including all downstream pfos) from the master and daughter pandora instances...
std::unique_ptr< art::Assns< recob::Cluster, recob::Hit > > ClusterToHitCollection

The documentation for this class was generated from the following files: