9 #include "Pandora/AlgorithmHeaders.h" 22 CosmicRayTrackRecoveryAlgorithm::CosmicRayTrackRecoveryAlgorithm() :
23 m_clusterMinLength(10.
f),
24 m_clusterMinSpanZ(2.
f),
25 m_clusterMinOverlapX(6.
f),
26 m_clusterMaxDeltaX(3.
f)
35 ClusterVector availableClustersU, availableClustersV, availableClustersW;
54 this->
MatchViews(cleanClustersU, cleanClustersV, slidingFitResultMap, matchedClustersUV);
55 this->
MatchViews(cleanClustersV, cleanClustersW, slidingFitResultMap, matchedClustersVW);
56 this->
MatchViews(cleanClustersW, cleanClustersU, slidingFitResultMap, matchedClustersWU);
62 matchedClustersUV, matchedClustersVW, matchedClustersWU, candidateParticles);
64 this->
MatchTwoViews(cleanClustersU, cleanClustersV, cleanClustersW,
65 matchedClustersUV, matchedClustersVW, matchedClustersWU, candidateParticles);
67 this->
MatchOneView(cleanClustersU, cleanClustersV, cleanClustersW,
68 matchedClustersUV, matchedClustersVW, matchedClustersWU, candidateParticles);
73 return STATUS_CODE_SUCCESS;
80 const ClusterList *pClusterList = NULL;
81 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_INITIALIZED, !=, PandoraContentApi::GetList(*
this,
82 inputClusterListName, pClusterList))
84 if (!pClusterList || pClusterList->empty())
86 if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
87 std::cout <<
"CosmicRayTrackRecoveryAlgorithm: unable to find cluster list " << inputClusterListName << std::endl;
89 return STATUS_CODE_SUCCESS;
92 for (
const Cluster *
const pCluster : *pClusterList)
94 if (PandoraContentApi::IsAvailable(*
this, pCluster))
95 clusterVector.push_back(pCluster);
100 return STATUS_CODE_SUCCESS;
109 const Cluster *
const pCluster = *iter;
116 CartesianVector minCoordinate(0.
f, 0.
f, 0.
f);
117 CartesianVector maxCoordinate(0.
f, 0.
f, 0.
f);
120 const CartesianVector deltaCoordinate(maxCoordinate - minCoordinate);
124 outputVector.push_back(pCluster);
132 const unsigned int m_halfWindowLayers(25);
137 if (slidingFitResultMap.end() == slidingFitResultMap.find(*iter))
143 if (!slidingFitResultMap.insert(TwoDSlidingFitResultMap::value_type(*iter, slidingFitResult)).second)
144 throw StatusCodeException(STATUS_CODE_FAILURE);
146 catch (StatusCodeException &statusCodeException)
148 if (STATUS_CODE_FAILURE == statusCodeException.GetStatusCode())
149 throw statusCodeException;
161 this->
MatchClusters(*iter1, clusterVector2, slidingFitResultMap, clusterAssociationMap);
164 this->
MatchClusters(*iter2, clusterVector1, slidingFitResultMap, clusterAssociationMap);
179 if (slidingFitResultMap.end() == fsIter)
180 throw StatusCodeException(STATUS_CODE_FAILURE);
185 const float xSpan1(std::fabs(outerVertex1.GetX() - innerVertex1.GetX()));
187 const Cluster *pBestClusterInner(NULL);
188 const Cluster *pBestClusterOuter(NULL);
189 const Cluster *pBestCluster(NULL);
197 const Cluster *
const pTargetCluster = *tIter;
200 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
204 if (slidingFitResultMap.end() == ftIter)
205 throw StatusCodeException(STATUS_CODE_FAILURE);
210 const float xSpan2(std::fabs(outerVertex2.GetX() - innerVertex2.GetX()));
212 if (xSpan2 > 1.5
f * xSpan1)
215 const float xMin1(
std::min(innerVertex1.GetX(), outerVertex1.GetX()));
216 const float xMax1(
std::max(innerVertex1.GetX(), outerVertex1.GetX()));
217 const float xMin2(
std::min(innerVertex2.GetX(), outerVertex2.GetX()));
218 const float xMax2(
std::max(innerVertex2.GetX(), outerVertex2.GetX()));
224 const float dxMin(std::fabs(xMin2 - xMin1));
225 const float dxMax(std::fabs(xMax2 - xMax1));
227 if (dxMin < bestDisplacementInner)
229 pBestClusterInner = pTargetCluster;
230 bestDisplacementInner = dxMin;
233 if (dxMax < bestDisplacementOuter)
235 pBestClusterOuter = pTargetCluster;
236 bestDisplacementOuter = dxMax;
239 if (dxMin + dxMax < bestDisplacement)
241 pBestCluster = pTargetCluster;
242 bestDisplacement = dxMin + dxMax;
248 ClusterList &seedList(clusterAssociationMap[pSeedCluster]);
250 if (seedList.end() == std::find(seedList.begin(), seedList.end(), pBestCluster))
251 seedList.push_back(pBestCluster);
253 ClusterList &bestList(clusterAssociationMap[pBestCluster]);
255 if (bestList.end() == std::find(bestList.begin(), bestList.end(), pSeedCluster))
256 bestList.push_back(pSeedCluster);
258 else if (pBestClusterInner && pBestClusterOuter)
263 if (slidingFitResultMap.end() == iterInner || slidingFitResultMap.end() == iterOuter)
264 throw StatusCodeException(STATUS_CODE_FAILURE);
275 catch (StatusCodeException &)
283 const float rSpan((pointingEndInner.GetPosition() - pointingEndOuter.GetPosition()).GetMagnitude());
288 ClusterList &bestInnerList(clusterAssociationMap[pBestClusterInner]);
290 if (bestInnerList.end() == std::find(bestInnerList.begin(), bestInnerList.end(), pSeedCluster))
291 bestInnerList.push_back(pSeedCluster);
293 ClusterList &bestOuterList(clusterAssociationMap[pBestClusterOuter]);
295 if (bestOuterList.end() == std::find(bestOuterList.begin(), bestOuterList.end(), pSeedCluster))
296 bestOuterList.push_back(pSeedCluster);
322 const Cluster *
const pCluster1 = *iter1;
324 if (vetoList.count(pCluster1))
328 const ClusterList matchedClusters31_pCluster1(iter311 != matchedClusters31.end() ? iter311->second : ClusterList());
331 const ClusterList matchedClusters12_pCluster1(iter121 != matchedClusters12.end() ? iter121->second : ClusterList());
335 const Cluster *
const pCluster2 = *iter2;
337 if (vetoList.count(pCluster2))
341 const ClusterList matchedClusters12_pCluster2(iter122 != matchedClusters12.end() ? iter122->second : ClusterList());
344 const ClusterList matchedClusters23_pCluster2(iter232 != matchedClusters23.end() ? iter232->second : ClusterList());
348 const Cluster *
const pCluster3 = *iter3;
350 if (vetoList.count(pCluster3))
354 const ClusterList matchedClusters23_pCluster3(iter233 != matchedClusters23.end() ? iter233->second : ClusterList());
357 const ClusterList matchedClusters31_pCluster3(iter313 != matchedClusters31.end() ? iter313->second : ClusterList());
359 const bool match12((matchedClusters12_pCluster1.size() + matchedClusters12_pCluster2.size() > 0) &&
360 ((matchedClusters12_pCluster1.size() == 1 && std::find(matchedClusters12_pCluster1.begin(), matchedClusters12_pCluster1.end(), pCluster2) != matchedClusters12_pCluster1.end()) ||
361 (matchedClusters12_pCluster1.size() == 0)) &&
362 ((matchedClusters12_pCluster2.size() == 1 && std::find(matchedClusters12_pCluster2.begin(), matchedClusters12_pCluster2.end(), pCluster1) != matchedClusters12_pCluster2.end()) ||
363 (matchedClusters12_pCluster2.size() == 0)));
365 const bool match23((matchedClusters23_pCluster2.size() + matchedClusters23_pCluster3.size() > 0) &&
366 ((matchedClusters23_pCluster2.size() == 1 && std::find(matchedClusters23_pCluster2.begin(), matchedClusters23_pCluster2.end(), pCluster3) != matchedClusters23_pCluster2.end()) ||
367 (matchedClusters23_pCluster2.size() == 0)) &&
368 ((matchedClusters23_pCluster3.size() == 1 && std::find(matchedClusters23_pCluster3.begin(), matchedClusters23_pCluster3.end(), pCluster2) != matchedClusters23_pCluster3.end()) ||
369 (matchedClusters23_pCluster3.size() == 0)));
371 const bool match31((matchedClusters31_pCluster3.size() + matchedClusters31_pCluster1.size() > 0) &&
372 ((matchedClusters31_pCluster3.size() == 1 && std::find(matchedClusters31_pCluster3.begin(), matchedClusters31_pCluster3.end(), pCluster1) != matchedClusters31_pCluster3.end()) ||
373 (matchedClusters31_pCluster3.size() == 0)) &&
374 ((matchedClusters31_pCluster1.size() == 1 && std::find(matchedClusters31_pCluster1.begin(), matchedClusters31_pCluster1.end(), pCluster3) != matchedClusters31_pCluster1.end()) ||
375 (matchedClusters31_pCluster1.size() == 0)));
377 if (match12 && match23 && match31)
383 newParticleList.push_back(newParticle);
403 for (
unsigned int iView = 0; iView < 3; ++iView)
405 const ClusterVector &clusterVector1((0 == iView) ? clusterVectorU : (1 == iView) ? clusterVectorV : clusterVectorW);
406 const ClusterVector &clusterVector2((0 == iView) ? clusterVectorV : (1 == iView) ? clusterVectorW : clusterVectorU);
407 const ClusterVector &clusterVector3((0 == iView) ? clusterVectorW : (1 == iView) ? clusterVectorU : clusterVectorV);
409 const ClusterAssociationMap &matchedClusters12(((0 == iView) ? matchedClustersUV : (1 == iView) ? matchedClustersVW : matchedClustersWU));
410 const ClusterAssociationMap &matchedClusters23(((0 == iView) ? matchedClustersVW : (1 == iView) ? matchedClustersWU : matchedClustersUV));
411 const ClusterAssociationMap &matchedClusters31(((0 == iView) ? matchedClustersWU : (1 == iView) ? matchedClustersUV : matchedClustersVW));
415 const Cluster *
const pCluster1 = *iter1;
417 if (vetoList.count(pCluster1))
421 const ClusterList matchedClusters31_pCluster1(iter311 != matchedClusters31.end() ? iter311->second : ClusterList());
424 const ClusterList matchedClusters12_pCluster1(iter121 != matchedClusters12.end() ? iter121->second : ClusterList());
428 const Cluster *
const pCluster2 = *iter2;
430 if (vetoList.count(pCluster2))
434 const ClusterList matchedClusters12_pCluster2(iter122 != matchedClusters12.end() ? iter122->second : ClusterList());
437 const ClusterList matchedClusters23_pCluster2(iter232 != matchedClusters23.end() ? iter232->second : ClusterList());
439 const bool match12((matchedClusters12_pCluster1.size() == 1 && std::find(matchedClusters12_pCluster1.begin(), matchedClusters12_pCluster1.end(), pCluster2) != matchedClusters12_pCluster1.end()) &&
440 (matchedClusters12_pCluster2.size() == 1 && std::find(matchedClusters12_pCluster2.begin(), matchedClusters12_pCluster2.end(), pCluster1) != matchedClusters12_pCluster2.end()) &&
441 (matchedClusters23_pCluster2.size() == 0 && matchedClusters31_pCluster1.size() == 0));
452 const Cluster *
const pCluster3 = *iter3;
454 if (vetoList.count(pCluster3))
458 const ClusterList matchedClusters23_pCluster3(iter233 != matchedClusters23.end() ? iter233->second : ClusterList());
461 const ClusterList matchedClusters31_pCluster3(iter313 != matchedClusters31.end() ? iter313->second : ClusterList());
463 const bool match3((matchedClusters31_pCluster3.size() + matchedClusters23_pCluster3.size() > 0) &&
464 ((matchedClusters31_pCluster3.size() == 1 && std::find(matchedClusters31_pCluster3.begin(), matchedClusters31_pCluster3.end(), pCluster1) != matchedClusters31_pCluster3.end()) ||
465 (matchedClusters31_pCluster3.size() == 0)) &&
466 ((matchedClusters23_pCluster3.size() == 1 && std::find(matchedClusters23_pCluster3.begin(), matchedClusters23_pCluster3.end(), pCluster2) != matchedClusters23_pCluster3.end()) ||
467 (matchedClusters23_pCluster3.size() == 0)));
473 newParticleList.push_back(newParticle);
492 for (
unsigned int iView = 0; iView < 3; ++iView)
494 const ClusterVector &clusterVector1((0 == iView) ? clusterVectorU : (1 == iView) ? clusterVectorV : clusterVectorW);
495 const ClusterVector &clusterVector2((0 == iView) ? clusterVectorV : (1 == iView) ? clusterVectorW : clusterVectorU);
496 const ClusterVector &clusterVector3((0 == iView) ? clusterVectorW : (1 == iView) ? clusterVectorU : clusterVectorV);
498 const ClusterAssociationMap &matchedClusters12(((0 == iView) ? matchedClustersUV : (1 == iView) ? matchedClustersVW : matchedClustersWU));
499 const ClusterAssociationMap &matchedClusters23(((0 == iView) ? matchedClustersVW : (1 == iView) ? matchedClustersWU : matchedClustersUV));
500 const ClusterAssociationMap &matchedClusters31(((0 == iView) ? matchedClustersWU : (1 == iView) ? matchedClustersUV : matchedClustersVW));
504 const Cluster *
const pCluster1 = *iter1;
506 if (vetoList.count(pCluster1))
510 const ClusterList matchedClusters31_pCluster1(iter311 != matchedClusters31.end() ? iter311->second : ClusterList());
513 const ClusterList matchedClusters12_pCluster1(iter121 != matchedClusters12.end() ? iter121->second : ClusterList());
515 if (matchedClusters12_pCluster1.size() + matchedClusters31_pCluster1.size() > 0)
523 const Cluster *
const pCluster2 = *iter2;
525 if (vetoList.count(pCluster2))
529 const ClusterList matchedClusters12_pCluster2(iter122 != matchedClusters12.end() ? iter122->second : ClusterList());
532 const ClusterList matchedClusters23_pCluster2(iter232 != matchedClusters23.end() ? iter232->second : ClusterList());
534 if (matchedClusters12_pCluster2.size() == 1 && std::find(matchedClusters12_pCluster2.begin(), matchedClusters12_pCluster2.end(), pCluster1) != matchedClusters12_pCluster2.end() &&
535 matchedClusters23_pCluster2.size() == 0)
541 const Cluster *
const pCluster3 = *iter3;
543 if (vetoList.count(pCluster3))
547 const ClusterList matchedClusters23_pCluster3(iter233 != matchedClusters23.end() ? iter233->second : ClusterList());
550 const ClusterList matchedClusters31_pCluster3(iter313 != matchedClusters31.end() ? iter313->second : ClusterList());
552 if (matchedClusters31_pCluster3.size() == 1 && std::find(matchedClusters31_pCluster3.begin(), matchedClusters31_pCluster3.end(), pCluster1) != matchedClusters31_pCluster3.end() &&
553 matchedClusters23_pCluster3.size() == 0)
558 newParticleList.push_back(newParticle);
580 for (
ParticleList::const_iterator pIter1 = inputParticleList.begin(), pIterEnd1 = inputParticleList.end(); pIter1 != pIterEnd1; ++pIter1)
582 const Particle &particle1 = *pIter1;
591 const Particle &particle2 = *pIter2;
594 ClusterSet duplicateSet;
598 const Cluster *pCluster = *cIter1;
600 if (clusterList2.end() != std::find(clusterList2.begin(), clusterList2.end(), pCluster))
601 duplicateSet.insert(pCluster);
604 if (duplicateSet.size() > 0 && clusterList1.size() != clusterList2.size())
612 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
614 outputParticleList.push_back(particle1);
616 catch (StatusCodeException &)
618 std::cout <<
" Warning in CosmicRayTrackRecoveryAlgorithm: found duplicate particles in candidate list " << std::endl;
627 if (particleList.empty())
630 const PfoList *pPfoList(
nullptr); std::string pfoListName;
631 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::CreateTemporaryListAndSetCurrent(*
this, pPfoList, pfoListName));
633 for (
const Particle &particle : particleList)
635 if (!PandoraContentApi::IsAvailable(*
this, &particle.m_clusterList))
638 ClusterList clusterList;
641 if (clusterList.empty())
642 throw StatusCodeException(STATUS_CODE_FAILURE);
644 PandoraContentApi::ParticleFlowObject::Parameters pfoParameters;
645 pfoParameters.m_particleId = MU_MINUS;
646 pfoParameters.m_charge = PdgTable::GetParticleCharge(pfoParameters.m_particleId.Get());
647 pfoParameters.m_mass = PdgTable::GetParticleMass(pfoParameters.m_particleId.Get());
648 pfoParameters.m_energy = 0.f;
649 pfoParameters.m_momentum = CartesianVector(0.
f, 0.
f, 0.
f);
650 pfoParameters.m_clusterList = clusterList;
652 const ParticleFlowObject *pPfo(
nullptr);
653 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ParticleFlowObject::Create(*
this, pfoParameters, pPfo));
656 if (!pPfoList->empty())
657 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::SaveList<Pfo>(*
this,
m_outputPfoListName));
664 ClusterList clusterListU, clusterListV, clusterListW;
669 for (
unsigned int iView = 0; iView < 3; ++iView)
671 const ClusterList clusterList((0 == iView) ? clusterListU : (1 == iView) ? clusterListV : clusterListW);
674 if (clusterList.empty())
677 const Cluster *
const pSeedCluster(clusterList.front());
679 if (!PandoraContentApi::IsAvailable(*
this, pSeedCluster))
680 throw StatusCodeException(STATUS_CODE_FAILURE);
682 for (
const Cluster *
const pAssociatedCluster : clusterList)
684 if (pAssociatedCluster == pSeedCluster)
687 if (!PandoraContentApi::IsAvailable(*
this, pAssociatedCluster))
690 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::MergeAndDeleteClusters(*
this, pSeedCluster, pAssociatedCluster,
691 inputClusterListName, inputClusterListName));
694 outputClusterList.push_back(pSeedCluster);
702 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
705 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
708 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
711 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
714 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle,
"InputClusterListNameU",
m_inputClusterListNameU));
715 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle,
"InputClusterListNameV",
m_inputClusterListNameV));
716 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle,
"InputClusterListNameW",
m_inputClusterListNameW));
717 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle,
"OutputPfoListName",
m_outputPfoListName));
719 return STATUS_CODE_SUCCESS;
std::string m_inputClusterListNameU
void BuildSlidingFitResultMap(const pandora::ClusterVector &clusterVector, TwoDSlidingFitResultMap &slidingFitResultMap) const
Build the map of sliding fit results.
void RemoveAmbiguities(const ParticleList &inputParticleList, ParticleList &outputParticleList) const
Remove particles with duplicate clusters.
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.
void MatchTwoViews(const pandora::ClusterVector &clusterVectorU, const pandora::ClusterVector &clusterVectorV, const pandora::ClusterVector &clusterVectorW, const ClusterAssociationMap &clusterAssociationMapUV, const ClusterAssociationMap &clusterAssociationMapVW, const ClusterAssociationMap &clusterAssociationMapWU, ParticleList &particleList) const
Create candidate particles using two primary clusters and one pair of broken clusters.
void BuildParticles(const ParticleList &particleList)
Build particle flow objects.
static bool IsEmission(const pandora::CartesianVector &parentVertex, const LArPointingCluster::Vertex &daughterVertex, const float minLongitudinalDistance, const float maxLongitudinalDistance, const float maxTransverseDistance, const float angularAllowance)
Whether pointing vertex is emitted from a given position.
std::string m_outputPfoListName
void MatchOneView(const pandora::ClusterVector &clusterVectorU, const pandora::ClusterVector &clusterVectorV, const pandora::ClusterVector &clusterVectorW, const ClusterAssociationMap &clusterAssociationMapUV, const ClusterAssociationMap &clusterAssociationMapVW, const ClusterAssociationMap &clusterAssociationMapWU, ParticleList &particleList) const
Create candidate particles using one primary cluster and one pair of broken clusters.
std::unordered_map< const pandora::Cluster *, pandora::ClusterList > ClusterAssociationMap
void MatchClusters(const pandora::Cluster *const pSeedCluster, const pandora::ClusterVector &targetClusters, const TwoDSlidingFitResultMap &slidingFitResultMap, ClusterAssociationMap &clusterAssociationMap) const
Match a seed cluster with a list of target clusters and populate the cluster association map...
void BuildVetoList(const ParticleList &particleList, pandora::ClusterSet &vetoList) const
Build the list of clusters already used to create particles.
static void GetClustersByHitType(const pandora::ClusterList &inputClusters, const pandora::HitType hitType, pandora::ClusterList &clusterList)
Get the subset of clusters, from a provided list, that match the specified hit type.
pandora::StatusCode Run()
LArPointingCluster class.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
static float GetWireZPitch(const pandora::Pandora &pandora, const float maxWirePitchDiscrepancy=0.01)
Return the wire pitch.
std::unordered_map< const pandora::Cluster *, TwoDSlidingFitResult > TwoDSlidingFitResultMap
static void GetClosestVertices(const bool useX, const bool useY, const bool useZ, const LArPointingCluster &pointingClusterI, const LArPointingCluster &pointingClusterJ, LArPointingCluster::Vertex &closestVertexI, LArPointingCluster::Vertex &closestVertexJ)
Given a pair of pointing clusters, receive the closest or farthest pair of vertices.
Header file for the geometry helper class.
static void GetClusterBoundingBox(const pandora::Cluster *const pCluster, pandora::CartesianVector &minimumCoordinate, pandora::CartesianVector &maximumCoordinate)
Get minimum and maximum X, Y and Z positions of the calo hits in a cluster.
void MatchThreeViews(const pandora::ClusterVector &clusterVectorU, const pandora::ClusterVector &clusterVectorV, const pandora::ClusterVector &clusterVectorW, const ClusterAssociationMap &clusterAssociationMapUV, const ClusterAssociationMap &clusterAssociationMapVW, const ClusterAssociationMap &clusterAssociationMapWU, ParticleList &particleList) const
Create candidate particles using three primary clusters.
pandora::StatusCode GetAvailableClusters(const std::string &inputClusterListName, pandora::ClusterVector &clusterVector) const
Get a vector of available clusters.
Header file for the cluster helper class.
const Vertex & GetOuterVertex() const
Get the outer vertex.
const Vertex & GetInnerVertex() const
Get the inner vertex.
pandora::CartesianVector GetGlobalMinLayerPosition() const
Get global position corresponding to the fit result in minimum fit layer.
std::vector< Particle > ParticleList
pandora::ClusterList m_clusterList
void SelectCleanClusters(const pandora::ClusterVector &inputVector, pandora::ClusterVector &outputVector) const
Select a set of clusters judged to be clean.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
std::string m_inputClusterListNameW
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
static float GetLengthSquared(const pandora::Cluster *const pCluster)
Get length squared of cluster.
std::string m_inputClusterListNameV
bool IsInnerVertex() const
Is this the inner vertex.
void MatchViews(const pandora::ClusterVector &clusterVector1, const pandora::ClusterVector &clusterVector2, const TwoDSlidingFitResultMap &slidingFitResultMap, ClusterAssociationMap &clusterAssociationMap) const
Match a pair of cluster vectors and populate the cluster association map.
void MergeClusters(const pandora::ClusterList &inputClusterList, pandora::ClusterList &outputClusterList) const
Merge broken clusters into a single cluster.
float m_clusterMinOverlapX
pandora::CartesianVector GetGlobalMaxLayerPosition() const
Get global position corresponding to the fit result in maximum fit layer.
const pandora::CartesianVector & GetPosition() const
Get the vertex position.
TwoDSlidingFitResult class.
Header file for the cosmic ray longitudinal track recovery algorithm class.