Classes | Public Types | Static Public Member Functions | List of all members
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 34 of file LArPandoraOutput.h.

Member Typedef Documentation

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

Definition at line 38 of file LArPandoraOutput.h.

Definition at line 42 of file LArPandoraOutput.h.

Definition at line 61 of file LArPandoraOutput.h.

Definition at line 37 of file LArPandoraOutput.h.

Definition at line 36 of file LArPandoraOutput.h.

Definition at line 40 of file LArPandoraOutput.h.

Definition at line 46 of file LArPandoraOutput.h.

Definition at line 54 of file LArPandoraOutput.h.

Definition at line 50 of file LArPandoraOutput.h.

Definition at line 59 of file LArPandoraOutput.h.

Definition at line 52 of file LArPandoraOutput.h.

Definition at line 57 of file LArPandoraOutput.h.

Definition at line 56 of file LArPandoraOutput.h.

Definition at line 47 of file LArPandoraOutput.h.

Definition at line 63 of file LArPandoraOutput.h.

Definition at line 43 of file LArPandoraOutput.h.

Definition at line 62 of file LArPandoraOutput.h.

Definition at line 44 of file LArPandoraOutput.h.

Definition at line 41 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 644 of file LArPandoraOutput.h.

649  {
650  const art::PtrMaker<A> makePtrA(event, instanceLabel);
651  art::Ptr<A> pA(makePtrA(idA));
652 
653  const art::PtrMaker<B> makePtrB(event, instanceLabel);
654  art::Ptr<B> pB(makePtrB(idB));
655 
656  association->addSingle(pA, pB);
657  }
Definition: fwd.h:31
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 663 of file LArPandoraOutput.h.

668  {
669  IdToIdVectorMap::const_iterator it(aToBMap.find(idA));
670  if (it == aToBMap.end())
671  throw cet::exception("LArPandora")
672  << " LArPandoraOutput::AddAssociation --- id doesn't exists in the assocaition map";
673 
674  const art::PtrMaker<A> makePtrA(event, instanceLabel);
675  art::Ptr<A> pA(makePtrA(idA));
676 
677  const art::PtrMaker<B> makePtrB(event, instanceLabel);
678  for (const size_t idB : it->second) {
679  art::Ptr<B> pB(makePtrB(idB));
680  association->addSingle(pA, pB);
681  }
682  }
intermediate_table::const_iterator const_iterator
Definition: fwd.h:31
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 688 of file LArPandoraOutput.h.

693  {
694  const art::PtrMaker<A> makePtrA(event, instanceLabel);
695  art::Ptr<A> pA(makePtrA(idA));
696 
697  for (const art::Ptr<B>& pB : bVector)
698  association->addSingle(pA, pB);
699  }
Definition: fwd.h:31
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 738 of file LArPandoraOutput.cxx.

744  {
745  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
746  if (pfoToVerticesMap.find(pfoId) != pfoToVerticesMap.end())
748  event, instanceLabel, pfoId, pfoToVerticesMap, outputParticlesToVertices);
749  }
750  }
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 1084 of file LArPandoraOutput.cxx.

1089  {
1090  if (hitVector.empty())
1091  throw cet::exception("LArPandora")
1092  << " LArPandoraOutput::BuildCluster --- No input hits were provided ";
1093 
1094  // Fill list of cluster properties
1095  geo::View_t view(geo::kUnknown);
1096  geo::PlaneID planeID;
1097 
1098  double startWire(+std::numeric_limits<float>::max()), sigmaStartWire(0.0);
1099  double startTime(+std::numeric_limits<float>::max()), sigmaStartTime(0.0);
1100  double endWire(-std::numeric_limits<float>::max()), sigmaEndWire(0.0);
1101  double endTime(-std::numeric_limits<float>::max()), sigmaEndTime(0.0);
1102 
1103  std::vector<recob::Hit const*> hits_for_params;
1104  hits_for_params.reserve(hitVector.size());
1105 
1106  for (const art::Ptr<recob::Hit>& hit : hitVector) {
1107  const double thisWire(hit->WireID().Wire);
1108  const double thisWireSigma(0.5);
1109  const double thisTime(hit->PeakTime());
1110  const double thisTimeSigma(double(2. * hit->RMS()));
1111  const geo::View_t thisView(hit->View());
1112  const geo::PlaneID thisPlaneID(hit->WireID().planeID());
1113 
1114  if (geo::kUnknown == view) {
1115  view = thisView;
1116  planeID = thisPlaneID;
1117  }
1118 
1119  if (!(thisView == view && thisPlaneID == planeID)) {
1120  throw cet::exception("LArPandora")
1121  << " LArPandoraOutput::BuildCluster --- Input hits have inconsistent plane IDs ";
1122  }
1123 
1124  hits_for_params.push_back(&*hit);
1125 
1126  if (isolatedHits.count(hit)) continue;
1127 
1128  if (thisWire < startWire || (thisWire == startWire && thisTime < startTime)) {
1129  startWire = thisWire;
1130  sigmaStartWire = thisWireSigma;
1131  startTime = thisTime;
1132  sigmaStartTime = thisTimeSigma;
1133  }
1134 
1135  if (thisWire > endWire || (thisWire == endWire && thisTime > endTime)) {
1136  endWire = thisWire;
1137  sigmaEndWire = thisWireSigma;
1138  endTime = thisTime;
1139  sigmaEndTime = thisTimeSigma;
1140  }
1141  }
1142 
1143  // feed the algorithm with all the cluster hits
1144  algo.SetHits(gser, hits_for_params);
1145 
1146  // create the recob::Cluster directly in the vector
1147  return cluster::ClusterCreator(gser,
1148  algo, // algo
1149  startWire, // start_wire
1150  sigmaStartWire, // sigma_start_wire
1151  startTime, // start_tick
1152  sigmaStartTime, // sigma_start_tick
1153  endWire, // end_wire
1154  sigmaEndWire, // sigma_end_wire
1155  endTime, // end_tick
1156  sigmaEndTime, // sigma_end_tick
1157  id, // ID
1158  view, // view
1159  planeID, // plane
1160  recob::Cluster::Sentry // sentry
1161  )
1162  .move();
1163  }
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:136
The data type to uniquely identify a Plane.
Definition: geo_types.h:472
static const SentryArgument_t Sentry
An instance of the sentry object.
Definition: Cluster.h:182
virtual void SetHits(util::GeometryUtilities const &gser, std::vector< recob::Hit const * > const &hits)=0
Sets the list of input hits.
static int max(int a, int b)
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 636 of file LArPandoraOutput.cxx.

644  {
645  cluster::StandardClusterParamsAlg clusterParamAlgo;
646 
648  auto const clock_data =
650  auto const det_prop =
652  util::GeometryUtilities const gser{*geom, clock_data, det_prop};
653 
654  // Produce the art clusters
655  size_t nextClusterId(0);
656  IdToIdVectorMap pandoraClusterToArtClustersMap;
657  for (const pandora::Cluster* const pCluster : clusterList) {
658  std::vector<HitVector> hitVectors;
659  const std::vector<recob::Cluster> clusters(
661  pCluster,
662  clusterList,
663  pandoraHitToArtHitMap,
664  pandoraClusterToArtClustersMap,
665  hitVectors,
666  nextClusterId,
667  clusterParamAlgo));
668 
669  if (hitVectors.size() != clusters.size())
670  throw cet::exception("LArPandora")
671  << " LArPandoraOutput::BuildClusters --- invalid hit vectors for clusters produced ";
672 
673  for (unsigned int i = 0; i < clusters.size(); ++i) {
675  event, instanceLabel, nextClusterId - 1, hitVectors.at(i), outputClustersToHits);
676  outputClusters->push_back(clusters.at(i));
677  }
678  }
679 
680  // Get mapping from pfo id to art cluster id
681  for (IdToIdVectorMap::const_iterator it = pfoToClustersMap.begin();
682  it != pfoToClustersMap.end();
683  ++it) {
684  if (!pfoToArtClustersMap.insert(IdToIdVectorMap::value_type(it->first, {})).second)
685  throw cet::exception("LArPandora")
686  << " LArPandoraOutput::BuildClusters --- repeated pfo ids ";
687 
688  for (const size_t pandoraClusterId : it->second) {
689  IdToIdVectorMap::const_iterator it2(pandoraClusterToArtClustersMap.find(pandoraClusterId));
690 
691  if (it2 == pandoraClusterToArtClustersMap.end())
692  throw cet::exception("LArPandora") << " LArPandoraOutput::BuildClusters --- found a "
693  "pandora cluster with no associated recob cluster ";
694 
695  for (const size_t recobClusterId : it2->second)
696  pfoToArtClustersMap.at(it->first).push_back(recobClusterId);
697  }
698  }
699  }
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 1025 of file LArPandoraOutput.cxx.

1033  {
1034  std::vector<recob::Cluster> clusters;
1035 
1036  // Get the cluster ID and set up the map entry
1037  const size_t clusterId(LArPandoraOutput::GetId(pCluster, clusterList));
1038  if (!pandoraClusterToArtClustersMap.insert(IdToIdVectorMap::value_type(clusterId, {})).second)
1039  throw cet::exception("LArPandora")
1040  << " LArPandoraOutput::BuildClusters --- repeated clusters in input list ";
1041 
1042  pandora::CaloHitVector sortedHits;
1043  LArPandoraOutput::GetHitsInCluster(pCluster, sortedHits);
1044 
1045  HitArray hitArray; // hits organised by drift volume
1046  HitList isolatedHits;
1047 
1048  for (const pandora::CaloHit* const pCaloHit2D : sortedHits) {
1049  CaloHitToArtHitMap::const_iterator it(pandoraHitToArtHitMap.find(pCaloHit2D));
1050  if (it == pandoraHitToArtHitMap.end())
1051  throw cet::exception("LArPandora")
1052  << " LArPandoraOutput::BuildClusters --- couldn't find art hit for input pandora hit ";
1053 
1054  const art::Ptr<recob::Hit> hit(it->second);
1055 
1056  const geo::WireID wireID(hit->WireID());
1057  const unsigned int volID(100000 * wireID.Cryostat + wireID.TPC);
1058  hitArray[volID].push_back(hit);
1059 
1060  if (pCaloHit2D->IsIsolated()) isolatedHits.insert(hit);
1061  }
1062 
1063  if (hitArray.empty())
1064  throw cet::exception("LArPandora")
1065  << " LArPandoraOutput::BuildClusters --- found a cluster with no hits ";
1066 
1067  for (const HitArray::value_type& hitArrayEntry : hitArray) {
1068  const HitVector& clusterHits(hitArrayEntry.second);
1069 
1070  clusters.push_back(
1071  LArPandoraOutput::BuildCluster(gser, nextId, clusterHits, isolatedHits, algo));
1072  hitVectors.push_back(clusterHits);
1073  pandoraClusterToArtClustersMap.at(clusterId).push_back(nextId);
1074 
1075  nextId++;
1076  }
1077 
1078  return clusters;
1079  }
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 859 of file LArPandoraOutput.cxx.

860  {
861  // Make a slice with dummy properties
862  const float bogusFloat(std::numeric_limits<float>::max());
863  const recob::tracking::Point_t bogusPoint(bogusFloat, bogusFloat, bogusFloat);
864  const recob::tracking::Vector_t bogusVector(bogusFloat, bogusFloat, bogusFloat);
865 
866  const unsigned int sliceIndex(outputSlices->size());
867  outputSlices->emplace_back(
868  sliceIndex, bogusPoint, bogusVector, bogusPoint, bogusPoint, bogusFloat, bogusFloat);
869 
870  return sliceIndex;
871  }
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:29
static int max(int a, int b)
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:26
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 755 of file LArPandoraOutput.cxx.

760  {
761  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
762  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
763 
765  instanceLabel,
766  pfoId,
767  outputParticleMetadata->size(),
768  outputParticlesToMetadata);
769  larpandoraobj::PFParticleMetadata pPFParticleMetadata(
771  outputParticleMetadata->push_back(pPFParticleMetadata);
772  }
773  }
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 967 of file LArPandoraOutput.cxx.

970  {
971  // Get parent Pfo ID
972  const pandora::PfoList& parentList(pPfo->GetParentPfoList());
973  if (parentList.size() > 1)
974  throw cet::exception("LArPandora")
975  << " LArPandoraOutput::BuildPFParticle --- this pfo has multiple parent particles ";
976 
977  const size_t parentId(parentList.empty() ?
979  LArPandoraOutput::GetId(parentList.front(), pfoVector));
980 
981  // Get daughters Pfo IDs
982  std::vector<size_t> daughterIds;
983  for (const pandora::ParticleFlowObject* const pDaughterPfo : pPfo->GetDaughterPfoList())
984  daughterIds.push_back(LArPandoraOutput::GetId(pDaughterPfo, pfoVector));
985 
986  std::sort(daughterIds.begin(), daughterIds.end());
987 
988  return recob::PFParticle(pPfo->GetParticleId(), pfoId, parentId, daughterIds);
989  }
static constexpr size_t kPFParticlePrimary
Define index to signify primary particle.
Definition: PFParticle.h:61
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 704 of file LArPandoraOutput.cxx.

714  {
715  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
716  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
717 
718  outputParticles->push_back(LArPandoraOutput::BuildPFParticle(pPfo, pfoId, pfoVector));
719 
720  // Associations from PFParticle
721  if (pfoToVerticesMap.find(pfoId) != pfoToVerticesMap.end())
723  event, instanceLabel, pfoId, pfoToVerticesMap, outputParticlesToVertices);
724 
725  if (pfoToThreeDHitsMap.find(pfoId) != pfoToThreeDHitsMap.end())
727  event, instanceLabel, pfoId, pfoToThreeDHitsMap, outputParticlesToSpacePoints);
728 
729  if (pfoToArtClustersMap.find(pfoId) != pfoToArtClustersMap.end())
731  event, instanceLabel, pfoId, pfoToArtClustersMap, outputParticlesToClusters);
732  }
733  }
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 907 of file LArPandoraOutput.cxx.

913  {
914  const unsigned int sliceIndex(LArPandoraOutput::BuildDummySlice(outputSlices));
915 
916  // Collect the pfos connected to the input primary pfos
917  pandora::PfoList pfosInSlice;
918  lar_content::LArPfoHelper::GetAllConnectedPfos(pParentPfo, pfosInSlice);
919  pfosInSlice.sort(lar_content::LArPfoHelper::SortByNHits);
920 
921  // Collect the hits from the pfos in all views
922  pandora::CaloHitList hits;
923  for (const pandora::ParticleFlowObject* const pPfo : pfosInSlice) {
924  for (const pandora::HitType& hitType :
925  {pandora::TPC_VIEW_U, pandora::TPC_VIEW_V, pandora::TPC_VIEW_W}) {
926  lar_content::LArPfoHelper::GetCaloHits(pPfo, hitType, hits);
928  }
929  }
930 
931  // Add the associations to the hits
932  for (const pandora::CaloHit* const pCaloHit : hits)
934  instanceLabel,
935  sliceIndex,
936  {LArPandoraOutput::GetHit(idToHitMap, pCaloHit)},
937  outputSlicesToHits);
938 
939  return sliceIndex;
940  }
static bool SortByNHits(const pandora::ParticleFlowObject *const pLhs, const pandora::ParticleFlowObject *const pRhs)
Sort pfos by number of constituent hits.
enum cvn::HType HitType
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.
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 778 of file LArPandoraOutput.cxx.

787  {
788  // Check for the special case in which there are no slices, and only the neutrino reconstruction was used on all hits
789  if (settings.m_isNeutrinoRecoOnlyNoSlicing) {
791  event,
792  instanceLabel,
793  pfoVector,
794  idToHitMap,
795  outputSlices,
796  outputParticlesToSlices,
797  outputSlicesToHits);
798  return;
799  }
800 
801  // Collect the slice pfos - one per slice (if there is no slicing instance, this vector will be empty)
802  pandora::PfoVector slicePfos;
803  LArPandoraOutput::GetPandoraSlices(pPrimaryPandora, slicePfos);
804 
805  // Make one slice per Pandora Slice pfo
806  for (const pandora::ParticleFlowObject* const pSlicePfo : slicePfos)
808  pSlicePfo, event, instanceLabel, idToHitMap, outputSlices, outputSlicesToHits);
809 
810  // Make a slice for every remaining pfo hierarchy that wasn't already in a slice
811  std::unordered_map<const pandora::ParticleFlowObject*, unsigned int> parentPfoToSliceIndexMap;
812  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
813  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
814 
815  // If this PFO is the parent of a hierarchy we have yet to use, then add a new slice
816  if (LArPandoraOutput::IsFromSlice(pPfo)) continue;
817 
818  if (lar_content::LArPfoHelper::GetParentPfo(pPfo) != pPfo) continue;
819 
820  if (!parentPfoToSliceIndexMap
821  .emplace(pPfo,
823  pPfo, event, instanceLabel, idToHitMap, outputSlices, outputSlicesToHits))
824  .second)
825  throw cet::exception("LArPandora")
826  << " LArPandoraOutput::BuildSlices --- found repeated primary particles ";
827  }
828 
829  // Add the associations from PFOs to slices
830  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
831  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
832 
833  // For PFOs that are from a Pandora slice, add the association and move on to the next PFO
834  if (LArPandoraOutput::IsFromSlice(pPfo)) {
836  instanceLabel,
837  pfoId,
839  outputParticlesToSlices);
840  continue;
841  }
842 
843  // Get the parent of the particle
844  const pandora::ParticleFlowObject* const pParent(
846  if (parentPfoToSliceIndexMap.find(pParent) == parentPfoToSliceIndexMap.end())
847  throw cet::exception("LArPandora")
848  << " LArPandoraOutput::BuildSlices --- found pfo without a parent in the input list ";
849 
850  // Add the association from the PFO to the slice
852  event, instanceLabel, pfoId, parentPfoToSliceIndexMap.at(pParent), outputParticlesToSlices);
853  }
854  }
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 1168 of file LArPandoraOutput.cxx.

1170  {
1171  if (pandora::TPC_3D != pCaloHit->GetHitType())
1172  throw cet::exception("LArPandora")
1173  << " LArPandoraOutput::BuildSpacePoint --- trying to build a space point from a 2D hit";
1174 
1175  const pandora::CartesianVector point(pCaloHit->GetPositionVector());
1176  double xyz[3] = {point.GetX(), point.GetY(), point.GetZ()};
1177 
1178  // ATTN using dummy information
1179  double dxdydz[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; // TODO: Fill in the error matrix
1180  double chi2(0.0);
1181 
1182  return recob::SpacePoint(xyz, dxdydz, chi2, spacePointId);
1183  }
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 609 of file LArPandoraOutput.cxx.

615  {
616  pandora::CaloHitVector threeDHitVector;
617  threeDHitVector.insert(threeDHitVector.end(), threeDHitList.begin(), threeDHitList.end());
618 
619  for (unsigned int hitId = 0; hitId < threeDHitVector.size(); hitId++) {
620  const pandora::CaloHit* const pCaloHit(threeDHitVector.at(hitId));
621 
622  CaloHitToArtHitMap::const_iterator it(pandoraHitToArtHitMap.find(pCaloHit));
623  if (it == pandoraHitToArtHitMap.end())
624  throw cet::exception("LArPandora") << " LArPandoraOutput::BuildSpacePoints --- found a "
625  "pandora hit without a corresponding art hit ";
626 
628  event, instanceLabel, hitId, {it->second}, outputSpacePointsToHits);
629  outputSpacePoints->push_back(LArPandoraOutput::BuildSpacePoint(pCaloHit, hitId));
630  }
631  }
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 1188 of file LArPandoraOutput.cxx.

1193  {
1194  const pandora::ParticleFlowObject* const pParent(lar_content::LArPfoHelper::GetParentPfo(pPfo));
1195  const float x0(pParent->GetPropertiesMap().count("X0") ? pParent->GetPropertiesMap().at("X0") :
1196  0.f);
1197 
1198  auto const clock_data = art::ServiceHandle<detinfo::DetectorClocksService const>()->DataFor(e);
1199  auto const det_prop =
1201  const double cm_per_tick(det_prop.GetXTicksCoefficient());
1202  const double ns_per_tick(sampling_rate(clock_data));
1203 
1204  // ATTN: T0 values are currently calculated in nanoseconds relative to the trigger offset. Only non-zero values are outputted.
1205  const double T0(x0 * ns_per_tick / cm_per_tick);
1206 
1207  if (std::fabs(T0) <= std::numeric_limits<double>::epsilon()) return false;
1208 
1209  // Output T0 objects [arguments are: time (nanoseconds); trigger type (3 for TPC stitching!); pfparticle SelfID code; T0 ID code]
1210  t0 = anab::T0(T0, 3, LArPandoraOutput::GetId(pPfo, pfoVector), nextId++);
1211 
1212  return true;
1213  }
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
const double e
static const pandora::ParticleFlowObject * GetParentPfo(const pandora::ParticleFlowObject *const pPfo)
Get the primary parent pfo.
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 945 of file LArPandoraOutput.cxx.

950  {
951  size_t nextT0Id(0);
952  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
953  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
954 
955  anab::T0 t0;
956  if (!LArPandoraOutput::BuildT0(event, pPfo, pfoVector, nextT0Id, t0)) continue;
957 
959  event, instanceLabel, pfoId, nextT0Id - 1, outputParticlesToT0s);
960  outputT0s->push_back(t0);
961  }
962  }
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 994 of file LArPandoraOutput.cxx.

995  {
996  double pos[3] = {
997  pVertex->GetPosition().GetX(), pVertex->GetPosition().GetY(), pVertex->GetPosition().GetZ()};
998  return recob::Vertex(pos, vertexId);
999  }
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 599 of file LArPandoraOutput.cxx.

601  {
602  for (size_t vertexId = 0; vertexId < vertexVector.size(); ++vertexId)
603  outputVertices->push_back(LArPandoraOutput::BuildVertex(vertexVector.at(vertexId), vertexId));
604  }
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 509 of file LArPandoraOutput.cxx.

511  {
512  // Get the sorted list of 3D hits associated with the pfo
513  pandora::CaloHitList threeDHits;
514  lar_content::LArPfoHelper::GetCaloHits(pPfo, pandora::TPC_3D, threeDHits);
515 
516  caloHits.insert(caloHits.end(), threeDHits.begin(), threeDHits.end());
517  std::sort(caloHits.begin(), caloHits.end(), lar_content::LArClusterHelper::SortHitsByPosition);
518  }
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 476 of file LArPandoraOutput.cxx.

478  {
479  pandora::CaloHitList caloHitList;
480 
481  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
482  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
483 
484  if (!pfoToThreeDHitsMap.insert(IdToIdVectorMap::value_type(pfoId, {})).second)
485  throw cet::exception("LArPandora")
486  << " LArPandoraOutput::Collect3DHits --- repeated pfos in input list ";
487 
488  pandora::CaloHitVector sorted3DHits;
489  LArPandoraOutput::Collect3DHits(pPfo, sorted3DHits);
490 
491  for (const pandora::CaloHit* const pCaloHit3D : sorted3DHits) {
492  if (pandora::TPC_3D !=
493  pCaloHit3D
494  ->GetHitType()) // TODO decide if this is required, or should I just insert them?
495  throw cet::exception("LArPandora")
496  << " LArPandoraOutput::Collect3DHits --- found a 2D hit in a 3D cluster";
497 
498  pfoToThreeDHitsMap.at(pfoId).push_back(caloHitList.size());
499  caloHitList.push_back(pCaloHit3D);
500  }
501  }
502 
503  return caloHitList;
504  }
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 277 of file LArPandoraOutput.cxx.

278  {
279  pandora::PfoList collectedPfos;
280 
281  // Get the list of slice pfos - one per slice
282  pandora::PfoVector slicePfos;
283  LArPandoraOutput::GetPandoraSlices(pPrimaryPandora, slicePfos);
284 
285  // Identify the pandora worker instances by their name
286  const pandora::Pandora* pSliceNuWorker(nullptr);
287  if (!LArPandoraOutput::GetPandoraInstance(pPrimaryPandora, "SliceNuWorker", pSliceNuWorker))
288  throw cet::exception("LArPandora")
289  << " LArPandoraOutput::CollectAllPfoOutcomes--- Can't find slice nu worker instance. ";
290 
291  const pandora::Pandora* pSliceCRWorker(nullptr);
292  if (!LArPandoraOutput::GetPandoraInstance(pPrimaryPandora, "SliceCRWorker", pSliceCRWorker))
293  throw cet::exception("LArPandora")
294  << " LArPandoraOutput::CollectAllPfoOutcomes--- Can't find slice CR worker instance. ";
295 
296  // Collect slices under both reconstruction hypotheses
297  for (unsigned int sliceIndex = 0; sliceIndex < slicePfos.size(); ++sliceIndex) {
298  const pandora::PfoList* pNuPfoList(nullptr);
299  if (pandora::STATUS_CODE_SUCCESS ==
300  PandoraApi::GetPfoList(
301  *pSliceNuWorker, "NeutrinoParticles3D" + std::to_string(sliceIndex), pNuPfoList))
302  collectedPfos.insert(collectedPfos.end(), pNuPfoList->begin(), pNuPfoList->end());
303 
304  const pandora::PfoList* pCRPfoList(nullptr);
305  if (pandora::STATUS_CODE_SUCCESS ==
306  PandoraApi::GetPfoList(
307  *pSliceCRWorker, "MuonParticles3D" + std::to_string(sliceIndex), pCRPfoList))
308  collectedPfos.insert(collectedPfos.end(), pCRPfoList->begin(), pCRPfoList->end());
309  }
310 
311  // Get the list of the parent pfos from the primary pandora instance
312  const pandora::PfoList* pParentPfoList(nullptr);
313  PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
314  !=,
315  PandoraApi::GetCurrentPfoList(*pPrimaryPandora, pParentPfoList));
316 
317  // Collect clear cosmic-rays
318  for (const pandora::ParticleFlowObject* const pPfo : *pParentPfoList) {
319  if (LArPandoraOutput::IsClearCosmic(pPfo)) collectedPfos.push_back(pPfo);
320  }
321 
322  // Collect all pfos that are downstream of the parents we have collected
323  pandora::PfoVector pfoVector;
324  LArPandoraOutput::CollectPfos(collectedPfos, pfoVector);
325 
326  return pfoVector;
327  }
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.
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.
std::string to_string(ModuleType const mt)
Definition: ModuleType.h:34
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 446 of file LArPandoraOutput.cxx.

448  {
449  pandora::ClusterList clusterList;
450 
451  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
452  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
453 
454  // Get the sorted list of clusters from the pfo
455  pandora::ClusterList clusters;
458 
459  // Get incrementing id's for each cluster
460  IdVector clusterIds(clusters.size());
461  std::iota(clusterIds.begin(), clusterIds.end(), clusterList.size());
462 
463  clusterList.insert(clusterList.end(), clusters.begin(), clusters.end());
464 
465  if (!pfoToClustersMap.insert(IdToIdVectorMap::value_type(pfoId, clusterIds)).second)
466  throw cet::exception("LArPandora")
467  << " LArPandoraOutput::CollectClusters --- repeated pfos in input list ";
468  }
469 
470  return clusterList;
471  }
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 375 of file LArPandoraOutput.cxx.

376  {
377  const pandora::PfoList* pParentPfoList(nullptr);
378  PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
379  !=,
380  PandoraApi::GetCurrentPfoList(*pPrimaryPandora, pParentPfoList));
381 
382  pandora::PfoVector pfoVector;
383  LArPandoraOutput::CollectPfos(*pParentPfoList, pfoVector);
384 
385  return pfoVector;
386  }
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 391 of file LArPandoraOutput.cxx.

393  {
394  if (!pfoVector.empty())
395  throw cet::exception("LArPandora")
396  << " LArPandoraOutput::CollectPfos--- trying to collect pfos into a non-empty list ";
397 
398  pandora::PfoList pfoList;
399  lar_content::LArPfoHelper::GetAllConnectedPfos(parentPfoList, pfoList);
400 
401  pfoVector.insert(pfoVector.end(), pfoList.begin(), pfoList.end());
402  std::sort(pfoVector.begin(), pfoVector.end(), lar_content::LArPfoHelper::SortByNHits);
403  }
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 408 of file LArPandoraOutput.cxx.

412  {
413  pandora::VertexVector vertexVector;
414 
415  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId) {
416  const pandora::ParticleFlowObject* const pPfo(pfoVector.at(pfoId));
417 
418  if (pPfo->GetVertexList().empty()) continue;
419 
420  try {
421  const pandora::Vertex* const pVertex(fCriteria(pPfo));
422 
423  // Get the vertex ID and add it to the vertex list if required
424  const auto it(std::find(vertexVector.begin(), vertexVector.end(), pVertex));
425  const bool isInList(it != vertexVector.end());
426  const size_t vertexId(isInList ? std::distance(vertexVector.begin(), it) :
427  vertexVector.size());
428 
429  if (!isInList) vertexVector.push_back(pVertex);
430 
431  if (!pfoToVerticesMap.insert(IdToIdVectorMap::value_type(pfoId, {vertexId})).second)
432  throw cet::exception("LArPandora")
433  << " LArPandoraOutput::CollectVertices --- repeated pfos in input list ";
434  }
435  catch (const pandora::StatusCodeException&) {
436  continue;
437  }
438  }
439 
440  return vertexVector;
441  }
double distance(double x1, double y1, double z1, double x2, double y2, double z2)
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 876 of file LArPandoraOutput.cxx.

884  {
885  const unsigned int sliceIndex(LArPandoraOutput::BuildDummySlice(outputSlices));
886 
887  // Add all of the hits in the events to the slice
888  HitVector hits;
889  LArPandoraHelper::CollectHits(event, settings.m_hitfinderModuleLabel, hits);
890  LArPandoraOutput::AddAssociation(event, instanceLabel, sliceIndex, hits, outputSlicesToHits);
891 
892  mf::LogDebug("LArPandora") << "Finding hits with label: " << settings.m_hitfinderModuleLabel
893  << std::endl;
894  mf::LogDebug("LArPandora") << " - Found " << hits.size() << std::endl;
895  mf::LogDebug("LArPandora") << " - Making associations " << outputSlicesToHits->size()
896  << std::endl;
897 
898  // Add all of the PFOs to the slice
899  for (unsigned int pfoId = 0; pfoId < pfoVector.size(); ++pfoId)
901  event, instanceLabel, pfoId, sliceIndex, outputParticlesToSlices);
902  }
static unsigned int BuildDummySlice(SliceCollection &outputSlices)
Build a new slice object with dummy information.
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.
QTextStream & endl(QTextStream &s)
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 567 of file LArPandoraOutput.cxx.

568  {
569  // TODO make this less evil
570 
571  // ATTN The CaloHit can come from the primary pandora instance (depth = 0) or one of its daughers (depth = 1).
572  // Here we keep trying to access the ART hit increasing the depth step-by-step
573  for (unsigned int depth = 0, maxDepth = 2; depth < maxDepth; ++depth) {
574  // Navigate to the hit address in the pandora master instance (assuming the depth is correct)
575  const pandora::CaloHit* pParentCaloHit = pCaloHit;
576  for (unsigned int i = 0; i < depth; ++i)
577  pParentCaloHit = static_cast<const pandora::CaloHit*>(pCaloHit->GetParentAddress());
578 
579  // Attempt to find the mapping from the "parent" calo hit to the ART hit
580  const void* const pHitAddress(pParentCaloHit->GetParentAddress());
581  const intptr_t hitID_temp((intptr_t)(pHitAddress));
582  const int hitID((int)(hitID_temp));
583 
584  IdToHitMap::const_iterator artIter = idToHitMap.find(hitID);
585 
586  // If there is no such mapping from "parent" calo hit to the ART hit, then increase the depth and try again!
587  if (idToHitMap.end() == artIter) continue;
588 
589  return artIter->second;
590  }
591 
592  throw cet::exception("LArPandora")
593  << " LArPandoraOutput::GetHit --- found a Pandora hit without a parent ART hit ";
594  }
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 1004 of file LArPandoraOutput.cxx.

1006  {
1007  if (!sortedHits.empty())
1008  throw cet::exception("LArPandora")
1009  << " LArPandoraOutput::GetHitsInCluster --- vector to hold hits is not empty ";
1010 
1011  pandora::CaloHitList hitList;
1012  pCluster->GetOrderedCaloHitList().FillCaloHitList(hitList);
1013  hitList.insert(hitList.end(),
1014  pCluster->GetIsolatedCaloHitList().begin(),
1015  pCluster->GetIsolatedCaloHitList().end());
1016 
1017  sortedHits.insert(sortedHits.end(), hitList.begin(), hitList.end());
1018  std::sort(
1019  sortedHits.begin(), sortedHits.end(), lar_content::LArClusterHelper::SortHitsByPosition);
1020  }
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 613 of file LArPandoraOutput.h.

614  {
615  typename std::list<const T*>::const_iterator it(std::find(tList.begin(), tList.end(), pT));
616 
617  if (it == tList.end())
618  throw cet::exception("LArPandora")
619  << " LArPandoraOutput::GetId --- can't find the id of supplied object";
620 
621  return static_cast<size_t>(std::distance(tList.begin(), it));
622  }
intermediate_table::const_iterator const_iterator
double distance(double x1, double y1, double z1, double x2, double y2, double z2)
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 628 of file LArPandoraOutput.h.

629  {
631  std::find(tVector.begin(), tVector.end(), pT));
632 
633  if (it == tVector.end())
634  throw cet::exception("LArPandora")
635  << " LArPandoraOutput::GetId --- can't find the id of supplied object";
636 
637  return static_cast<size_t>(std::distance(tVector.begin(), it));
638  }
intermediate_table::const_iterator const_iterator
double distance(double x1, double y1, double z1, double x2, double y2, double z2)
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 223 of file LArPandoraOutput.cxx.

226  {
227  if (!pPrimaryPandora)
228  throw cet::exception("LArPandora") << " LArPandoraOutput::GetPandoraInstance--- input "
229  "primary pandora instance address is invalid ";
230 
231  if (pPandoraInstance)
232  throw cet::exception("LArPandora") << " LArPandoraOutput::GetPandoraInstance--- the input "
233  "pandora instance address is non-null ";
234 
235  for (const pandora::Pandora* const pPandora :
237  if (pPandora->GetName() != name) continue;
238 
239  if (pPandoraInstance)
240  throw cet::exception("LArPandora")
241  << " LArPandoraOutput::GetPandoraInstance--- found multiple pandora instances with name: "
242  << name;
243 
244  pPandoraInstance = pPandora;
245  }
246 
247  return static_cast<bool>(pPandoraInstance);
248  }
static QCString name
Definition: declinfo.cpp:673
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 253 of file LArPandoraOutput.cxx.

255  {
256  if (!slicePfos.empty())
257  throw cet::exception("LArPandora")
258  << " LArPandoraOutput::GetPandoraSlices--- Input slicePfo vector is not empty ";
259 
260  // Get the pandora slicing worker - if it exists
261  const pandora::Pandora* pSlicingWorker(nullptr);
262  if (!LArPandoraOutput::GetPandoraInstance(pPrimaryPandora, "SlicingWorker", pSlicingWorker))
263  return;
264 
265  // Get the slice PFOs - one PFO per slice
266  const pandora::PfoList* pSlicePfoList(nullptr);
267  PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
268  !=,
269  PandoraApi::GetCurrentPfoList(*pSlicingWorker, pSlicePfoList));
270 
271  slicePfos.insert(slicePfos.end(), pSlicePfoList->begin(), pSlicePfoList->end());
272  }
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 523 of file LArPandoraOutput.cxx.

527  {
528  // Collect 2D hits from clusters
529  for (const pandora::Cluster* const pCluster : clusterList) {
530  if (pandora::TPC_3D == lar_content::LArClusterHelper::GetClusterHitType(pCluster))
531  throw cet::exception("LArPandora")
532  << " LArPandoraOutput::GetPandoraToArtHitMap --- found a 3D input cluster ";
533 
534  pandora::CaloHitVector sortedHits;
535  LArPandoraOutput::GetHitsInCluster(pCluster, sortedHits);
536 
537  for (const pandora::CaloHit* const pCaloHit : sortedHits) {
538  if (!pandoraHitToArtHitMap
539  .insert(CaloHitToArtHitMap::value_type(
540  pCaloHit, LArPandoraOutput::GetHit(idToHitMap, pCaloHit)))
541  .second)
542  throw cet::exception("LArPandora")
543  << " LArPandoraOutput::GetPandoraToArtHitMap --- found repeated input hits ";
544  }
545  }
546 
547  for (const pandora::CaloHit* const pCaloHit : threeDHitList) {
548  if (pCaloHit->GetHitType() != pandora::TPC_3D)
549  throw cet::exception("LArPandora")
550  << " LArPandoraOutput::GetPandoraToArtHitMap --- found a non-3D hit in the input list ";
551 
552  // ATTN get the 2D calo hit from the 3D calo hit then find the art hit!
553  if (!pandoraHitToArtHitMap
554  .insert(CaloHitToArtHitMap::value_type(
555  pCaloHit,
557  idToHitMap, static_cast<const pandora::CaloHit*>(pCaloHit->GetParentAddress()))))
558  .second)
559  throw cet::exception("LArPandora")
560  << " LArPandoraOutput::GetPandoraToArtHitMap --- found repeated input hits ";
561  }
562  }
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:85
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 358 of file LArPandoraOutput.cxx.

359  {
360  const pandora::ParticleFlowObject* const pParent(lar_content::LArPfoHelper::GetParentPfo(pPfo));
361 
362  const auto& properties(pParent->GetPropertiesMap());
363  const auto it(properties.find("SliceIndex"));
364 
365  if (it == properties.end())
366  throw cet::exception("LArPandora")
367  << " LArPandoraOutput::GetSliceIndex--- Input PFO was not from a slice ";
368 
369  return static_cast<unsigned int>(std::round(it->second));
370  }
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 332 of file LArPandoraOutput.cxx.

333  {
334  const pandora::ParticleFlowObject* const pParent(lar_content::LArPfoHelper::GetParentPfo(pPfo));
335 
336  const auto& properties(pParent->GetPropertiesMap());
337  const auto it(properties.find("IsClearCosmic"));
338 
339  if (it == properties.end()) return false;
340 
341  return static_cast<bool>(std::round(it->second));
342  }
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 347 of file LArPandoraOutput.cxx.

348  {
349  const pandora::ParticleFlowObject* const pParent(lar_content::LArPfoHelper::GetParentPfo(pPfo));
350 
351  const auto& properties(pParent->GetPropertiesMap());
352  return (properties.find("SliceIndex") != properties.end());
353  }
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 50 of file LArPandoraOutput.cxx.

53  {
54  settings.Validate();
55  const std::string instanceLabel(
56  settings.m_shouldProduceAllOutcomes ? settings.m_allOutcomesInstanceLabel : "");
57  const std::string testBeamInteractionVertexInstanceLabel(
58  instanceLabel + settings.m_testBeamInteractionVerticesInstanceLabel);
59 
60  // Set up mandatory output collections
61  PFParticleCollection outputParticles(new std::vector<recob::PFParticle>);
62  VertexCollection outputVertices(new std::vector<recob::Vertex>);
63  ClusterCollection outputClusters(new std::vector<recob::Cluster>);
64  SpacePointCollection outputSpacePoints(new std::vector<recob::SpacePoint>);
65  PFParticleMetadataCollection outputParticleMetadata(
66  new std::vector<larpandoraobj::PFParticleMetadata>);
67 
68  // Set up optional output collections
69  VertexCollection outputTestBeamInteractionVertices(
70  settings.m_shouldProduceTestBeamInteractionVertices ? new std::vector<recob::Vertex> :
71  nullptr);
72  T0Collection outputT0s(settings.m_shouldRunStitching ? new std::vector<anab::T0> : nullptr);
73  SliceCollection outputSlices(settings.m_shouldProduceSlices ? new std::vector<recob::Slice> :
74  nullptr);
75 
76  // Set up mandatory output associations
77  PFParticleToMetadataCollection outputParticlesToMetadata(
79  PFParticleToSpacePointCollection outputParticlesToSpacePoints(
81  PFParticleToClusterCollection outputParticlesToClusters(
83  PFParticleToVertexCollection outputParticlesToVertices(
86  SpacePointToHitCollection outputSpacePointsToHits(
89 
90  // Set up optional output associations
91  PFParticleToVertexCollection outputParticlesToTestBeamInteractionVertices(
92  settings.m_shouldProduceTestBeamInteractionVertices ?
94  nullptr);
95  PFParticleToT0Collection outputParticlesToT0s(
96  settings.m_shouldRunStitching ? new art::Assns<recob::PFParticle, anab::T0> : nullptr);
97  PFParticleToSliceCollection outputParticlesToSlices(
98  settings.m_shouldProduceSlices ? new art::Assns<recob::PFParticle, recob::Slice> : nullptr);
99 
100  // Collect immutable lists of pandora collections that we should convert to ART format
101  const pandora::PfoVector pfoVector(
102  settings.m_shouldProduceAllOutcomes ?
103  LArPandoraOutput::CollectAllPfoOutcomes(settings.m_pPrimaryPandora) :
104  LArPandoraOutput::CollectPfos(settings.m_pPrimaryPandora));
105 
106  IdToIdVectorMap pfoToVerticesMap, pfoToTestBeamInteractionVerticesMap;
108  pfoVector, pfoToVerticesMap, lar_content::LArPfoHelper::GetVertex));
109  const pandora::VertexVector testBeamInteractionVertexVector(
110  settings.m_shouldProduceTestBeamInteractionVertices ?
112  pfoToTestBeamInteractionVerticesMap,
115 
116  IdToIdVectorMap pfoToClustersMap;
117  const pandora::ClusterList clusterList(
118  LArPandoraOutput::CollectClusters(pfoVector, pfoToClustersMap));
119 
120  IdToIdVectorMap pfoToThreeDHitsMap;
121  const pandora::CaloHitList threeDHitList(
122  LArPandoraOutput::Collect3DHits(pfoVector, pfoToThreeDHitsMap));
123 
124  // Get mapping from pandora hits to art hits
125  CaloHitToArtHitMap pandoraHitToArtHitMap;
127  clusterList, threeDHitList, idToHitMap, pandoraHitToArtHitMap);
128 
129  // Build the ART outputs from the pandora objects
130  LArPandoraOutput::BuildVertices(vertexVector, outputVertices);
131 
132  if (settings.m_shouldProduceTestBeamInteractionVertices)
133  LArPandoraOutput::BuildVertices(testBeamInteractionVertexVector,
134  outputTestBeamInteractionVertices);
135 
137  instanceLabel,
138  threeDHitList,
139  pandoraHitToArtHitMap,
140  outputSpacePoints,
141  outputSpacePointsToHits);
142 
143  IdToIdVectorMap pfoToArtClustersMap;
145  instanceLabel,
146  clusterList,
147  pandoraHitToArtHitMap,
148  pfoToClustersMap,
149  outputClusters,
150  outputClustersToHits,
151  pfoToArtClustersMap);
152 
154  instanceLabel,
155  pfoVector,
156  pfoToVerticesMap,
157  pfoToThreeDHitsMap,
158  pfoToArtClustersMap,
159  outputParticles,
160  outputParticlesToVertices,
161  outputParticlesToSpacePoints,
162  outputParticlesToClusters);
163 
165  evt, instanceLabel, pfoVector, outputParticleMetadata, outputParticlesToMetadata);
166 
167  if (settings.m_shouldProduceSlices)
169  settings.m_pPrimaryPandora,
170  evt,
171  instanceLabel,
172  pfoVector,
173  idToHitMap,
174  outputSlices,
175  outputParticlesToSlices,
176  outputSlicesToHits);
177 
178  if (settings.m_shouldRunStitching)
179  LArPandoraOutput::BuildT0s(evt, instanceLabel, pfoVector, outputT0s, outputParticlesToT0s);
180 
181  if (settings.m_shouldProduceTestBeamInteractionVertices)
183  instanceLabel,
184  pfoVector,
185  pfoToTestBeamInteractionVerticesMap,
186  outputParticlesToTestBeamInteractionVertices);
187 
188  // Add the outputs to the event
189  evt.put(std::move(outputParticles), instanceLabel);
190  evt.put(std::move(outputSpacePoints), instanceLabel);
191  evt.put(std::move(outputClusters), instanceLabel);
192  evt.put(std::move(outputVertices), instanceLabel);
193  evt.put(std::move(outputParticleMetadata), instanceLabel);
194 
195  evt.put(std::move(outputParticlesToMetadata), instanceLabel);
196  evt.put(std::move(outputParticlesToSpacePoints), instanceLabel);
197  evt.put(std::move(outputParticlesToClusters), instanceLabel);
198  evt.put(std::move(outputParticlesToVertices), instanceLabel);
199  evt.put(std::move(outputParticlesToSlices), instanceLabel);
200  evt.put(std::move(outputSpacePointsToHits), instanceLabel);
201  evt.put(std::move(outputClustersToHits), instanceLabel);
202 
203  if (settings.m_shouldProduceTestBeamInteractionVertices) {
204  evt.put(std::move(outputTestBeamInteractionVertices), testBeamInteractionVertexInstanceLabel);
205  evt.put(std::move(outputParticlesToTestBeamInteractionVertices),
206  testBeamInteractionVertexInstanceLabel);
207  }
208 
209  if (settings.m_shouldRunStitching) {
210  evt.put(std::move(outputT0s), instanceLabel);
211  evt.put(std::move(outputParticlesToT0s), instanceLabel);
212  }
213 
214  if (settings.m_shouldProduceSlices) {
215  evt.put(std::move(outputSlices), instanceLabel);
216  evt.put(std::move(outputSlicesToHits), instanceLabel);
217  }
218  }
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::string string
Definition: nybbler.cc:12
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
std::unique_ptr< art::Assns< recob::PFParticle, anab::T0 > > PFParticleToT0Collection
def move(depos, offset)
Definition: depos.py:107
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.
ProductID put(std::unique_ptr< PROD > &&edp, std::string const &instance={})
Definition: DataViewImpl.h:686
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: