38 m_trainingSetMode(false),
39 m_allowClassifyDuringTraining(false),
40 m_mcVertexXCorrection(0.f),
41 m_minClusterCaloHits(12),
42 m_slidingFitWindow(100),
43 m_minShowerSpineLength(15.f),
44 m_beamDeweightingConstant(0.4),
45 m_localAsymmetryConstant(3.f),
46 m_globalAsymmetryConstant(1.f),
47 m_showerAsymmetryConstant(1.f),
48 m_energyKickConstant(0.06),
49 m_showerClusteringDistance(3.f),
50 m_minShowerClusterHits(1),
51 m_useShowerClusteringApproximation(false),
53 m_rPhiFineTuningRadius(2.f),
54 m_maxTrueVertexRadius(1.f),
55 m_useRPhiFeatureForRegion(false),
56 m_dropFailedRPhiFastScoreCandidates(true),
57 m_testBeamMode(false),
58 m_legacyEventShapes(true),
59 m_legacyVariables(true)
72 ClusterList availableShowerLikeClusters(showerLikeClusters.begin(), showerLikeClusters.end());
78 this->
PopulateKdTree(availableShowerLikeClusters, kdTree, hitToClusterMap);
80 while (!availableShowerLikeClusters.empty())
83 showerCluster.push_back(availableShowerLikeClusters.back());
84 availableShowerLikeClusters.pop_back();
86 bool addedCluster(
true);
87 while (addedCluster && !availableShowerLikeClusters.empty())
90 for (
const Cluster *
const pCluster : showerCluster)
94 addedCluster = this->
AddClusterToShower(kdTree, hitToClusterMap, availableShowerLikeClusters, pCluster, showerCluster);
98 addedCluster = this->
AddClusterToShower(clusterEndPointsMap, availableShowerLikeClusters, pCluster, showerCluster);
106 unsigned int totHits(0);
107 for (
const Cluster *
const pCluster : showerCluster)
108 totHits += pCluster->GetNCaloHits();
122 for (
const Cluster *
const pCluster : clusterList)
128 showerLikeClusters.push_back(pCluster);
131 pCluster->GetOrderedCaloHitList().FillCaloHitList(clusterCaloHitList);
133 CaloHitVector clusterCaloHitVector(clusterCaloHitList.begin(), clusterCaloHitList.end());
136 if (clusterCaloHitVector.empty())
139 ClusterEndPoints clusterEndPoints(clusterCaloHitVector.front()->GetPositionVector(), clusterCaloHitVector.back()->GetPositionVector());
140 clusterEndPointsMap.emplace(pCluster, clusterEndPoints);
150 for (
const Cluster *
const pCluster : clusterList)
153 pCluster->GetOrderedCaloHitList().FillCaloHitList(daughterHits);
154 allCaloHits.insert(allCaloHits.end(), daughterHits.begin(), daughterHits.end());
156 for (
const CaloHit *
const pCaloHit : daughterHits)
157 (
void)hitToClusterMap.insert(HitToClusterMap::value_type(pCaloHit, pCluster));
162 kdTree.
build(hitKDNode2DList, hitsBoundingRegion2D);
170 const auto existingEndPointsIter(clusterEndPointsMap.find(pCluster));
171 if (existingEndPointsIter == clusterEndPointsMap.end())
174 const ClusterEndPoints &existingClusterEndPoints(existingEndPointsIter->second);
176 for (
auto iter = availableShowerLikeClusters.begin(); iter != availableShowerLikeClusters.end(); ++iter)
178 const Cluster *
const pAvailableShowerLikeCluster(*iter);
179 const auto &newEndPointsIter(clusterEndPointsMap.find(pAvailableShowerLikeCluster));
181 if (newEndPointsIter == clusterEndPointsMap.end())
185 const float startStartDistance((newClusterEndPoints.first - existingClusterEndPoints.first).GetMagnitude());
186 const float startEndDistance((newClusterEndPoints.first - existingClusterEndPoints.second).GetMagnitude());
187 const float endStartDistance((newClusterEndPoints.second - existingClusterEndPoints.first).GetMagnitude());
188 const float endEndDistance((newClusterEndPoints.second - existingClusterEndPoints.second).GetMagnitude());
190 const float smallestDistance(std::min(std::min(startStartDistance, startEndDistance), std::min(endStartDistance, endEndDistance)));
194 showerCluster.push_back(pAvailableShowerLikeCluster);
195 availableShowerLikeClusters.erase(iter);
212 for (
const CaloHit *
const pCaloHit : daughterHits)
217 kdTree.
search(searchRegionHits, found);
219 for (
const auto &hit : found)
220 (
void)nearbyClusters.insert(hitToClusterMap.at(hit.data));
223 for (
auto iter = availableShowerLikeClusters.begin(); iter != availableShowerLikeClusters.end(); ++iter)
225 const Cluster *
const pAvailableShowerLikeCluster(*iter);
227 if ((pAvailableShowerLikeCluster != pCluster) && nearbyClusters.count(pAvailableShowerLikeCluster))
229 showerCluster.push_back(pAvailableShowerLikeCluster);
230 availableShowerLikeClusters.erase(iter);
243 float eventEnergy(0.f);
244 unsigned int nShoweryHits(0), nHits(0);
250 const unsigned int nClusters(clusterListU.size() + clusterListV.size() + clusterListW.size());
251 const float eventShoweryness((nHits > 0) ?
static_cast<float>(nShoweryHits) /
static_cast<float>(nHits) : 0.f);
254 allClusters.insert(allClusters.end(), clusterListV.begin(), clusterListV.end());
255 allClusters.insert(allClusters.end(), clusterListW.begin(), clusterListW.end());
259 float eventArea(0.f), longitudinality(0.f);
265 return EventFeatureInfo(eventShoweryness, eventEnergy, eventArea, longitudinality, nHits, nClusters, vertexVector.size());
271 const ClusterList &clusterList,
unsigned int &nShoweryHits,
unsigned int &nHits,
float &eventEnergy)
const
273 for (
const Cluster *
const pCluster : clusterList)
276 nShoweryHits += pCluster->GetNCaloHits();
278 eventEnergy += pCluster->GetElectromagneticEnergy();
279 nHits += pCluster->GetNCaloHits();
294 InputFloat xMin, yMin, zMin, xMax, yMax, zMax;
296 for (
const Cluster *
const pCluster : clusterList)
298 CartesianVector minPosition(0.f, 0.f, 0.f), maxPosition(0.f, 0.f, 0.f);
311 if ((xSpan > std::numeric_limits<float>::epsilon()) && (ySpan > std::numeric_limits<float>::epsilon()))
313 eventVolume = xSpan * ySpan * zSpan;
314 longitudinality = zSpan / (xSpan + ySpan);
317 else if (ySpan > std::numeric_limits<float>::epsilon())
319 eventVolume = ySpan * ySpan * zSpan;
320 longitudinality = zSpan / (ySpan + ySpan);
323 else if (xSpan > std::numeric_limits<float>::epsilon())
325 eventVolume = xSpan * xSpan * zSpan;
326 longitudinality = zSpan / (xSpan + xSpan);
334 float xSpanU(0.f), zSpanU(0.f), xSpanV(0.f), zSpanV(0.f), xSpanW(0.f), zSpanW(0.f);
340 const float xSpan = (xSpanU + xSpanV + xSpanW) / 3.f;
341 const float zSpan = (zSpanU + zSpanV + zSpanW) / 3.f;
343 if ((xSpan > std::numeric_limits<float>::epsilon()) && (zSpan > std::numeric_limits<float>::epsilon()))
345 eventArea = xSpan * zSpan;
346 longitudinality = zSpan / (xSpan + zSpan);
356 for (
const Cluster *
const pCluster : clusterList)
362 for (CaloHitList::const_iterator hitIter = iter->second->begin(), hitIterEnd = iter->second->end(); hitIter != hitIterEnd; ++hitIter)
364 xPositions.push_back((*hitIter)->GetPositionVector().GetX());
365 zPositions.push_back((*hitIter)->GetPositionVector().GetZ());
370 std::sort(xPositions.begin(), xPositions.end());
371 std::sort(zPositions.begin(), zPositions.end());
373 if (xPositions.empty())
380 const int low = std::round(0.05 * xPositions.size());
381 const int high = std::round(0.95 * xPositions.size()) - 1;
383 xSpan = xPositions[high] - xPositions[low];
384 zSpan = zPositions[high] - zPositions[low];
391 const float minPositionCoord,
const float maxPositionCoord,
InputFloat &minCoord,
InputFloat &maxCoord)
const
394 minCoord = minPositionCoord;
397 maxCoord = maxPositionCoord;
405 return std::fabs(maxCoord.
Get() - minCoord.
Get());
415 featureVector.push_back(
static_cast<double>(eventFeatureInfo.
m_eventEnergy));
416 featureVector.push_back(
static_cast<double>(eventFeatureInfo.
m_eventArea));
417 featureVector.push_back(
static_cast<double>(eventFeatureInfo.
m_longitudinality));
420 featureVector.push_back(
static_cast<double>(eventFeatureInfo.
m_nHits));
421 featureVector.push_back(
static_cast<double>(eventFeatureInfo.
m_nClusters));
422 featureVector.push_back(
static_cast<double>(eventFeatureInfo.
m_nCandidates));
432 float bestFastScore(-std::numeric_limits<float>::max());
435 double tempBeamDeweight{0.f};
439 const double beamDeweighting(tempBeamDeweight);
441 const double energyKick(LArMvaHelper::CalculateFeaturesOfType<EnergyKickFeatureTool>(
m_featureToolVector,
this, pVertex,
442 slidingFitDataListMap, clusterListMap, kdTreeMap, showerClusterListMap, beamDeweighting, bestFastScore)
446 const double localAsymmetry(LArMvaHelper::CalculateFeaturesOfType<LocalAsymmetryFeatureTool>(
m_featureToolVector,
this, pVertex,
447 slidingFitDataListMap, clusterListMap, kdTreeMap, showerClusterListMap, beamDeweighting, bestFastScore)
451 const double globalAsymmetry(LArMvaHelper::CalculateFeaturesOfType<GlobalAsymmetryFeatureTool>(
m_featureToolVector,
this, pVertex,
452 slidingFitDataListMap, clusterListMap, kdTreeMap, showerClusterListMap, beamDeweighting, bestFastScore)
456 const double showerAsymmetry(LArMvaHelper::CalculateFeaturesOfType<ShowerAsymmetryFeatureTool>(
m_featureToolVector,
this, pVertex,
457 slidingFitDataListMap, clusterListMap, kdTreeMap, showerClusterListMap, beamDeweighting, bestFastScore)
464 double dEdxAsymmetry(0.f), vertexEnergy(0.f);
468 dEdxAsymmetry = LArMvaHelper::CalculateFeaturesOfType<EnergyDepositionAsymmetryFeatureTool>(
m_featureToolVector,
this, pVertex,
469 slidingFitDataListMap, clusterListMap, kdTreeMap, showerClusterListMap, beamDeweighting, bestFastScore)
476 VertexFeatureInfo vertexFeatureInfo(beamDeweighting, 0.f, energyKick, localAsymmetry, globalAsymmetry, showerAsymmetry, dEdxAsymmetry, vertexEnergy);
477 vertexFeatureInfoMap.emplace(pVertex, vertexFeatureInfo);
493 initialScoreList.emplace_back(pVertex, beamDeweightingScore + energyKickScore + localAsymmetryScore + globalAsymmetryScore + showerAsymmetryScore);
500 std::sort(initialScoreList.begin(), initialScoreList.end());
502 for (
const VertexScore &vertexScore : initialScoreList)
504 const Vertex *
const pVertex(vertexScore.GetVertex());
505 bool farEnoughAway(
true);
507 for (
const Vertex *
const pRegionVertex : bestRegionVertices)
509 if (pRegionVertex == pVertex)
511 farEnoughAway =
false;
515 const float distance = (pRegionVertex->GetPosition() - pVertex->
GetPosition()).GetMagnitude();
519 farEnoughAway =
false;
525 bestRegionVertices.push_back(pVertex);
534 if (vertexVector.empty())
538 std::random_device device;
539 std::mt19937 generator(device());
540 std::bernoulli_distribution coinFlip(0.5);
550 for (
const Vertex *
const pVertex : vertexVector)
552 if (pVertex == pBestRegionVertex)
556 regionalVertices.push_back(pVertex);
562 if (!regionalVertices.empty())
574 float bestFastScore(-std::numeric_limits<float>::max());
576 for (
auto iter = vertexVector.begin(); iter != vertexVector.end(); )
585 iter = vertexVector.erase(iter);
618 for (
const auto &mapEntry : targetMCParticlesToGoodHitsMap)
619 mcPrimaryList.push_back(mapEntry.first);
629 const VertexFeatureInfoMap &vertexFeatureInfoMap, std::bernoulli_distribution &coinFlip, std::mt19937 &generator,
631 const KDTreeMap &kdTreeMap,
const float maxRadius,
const bool useRPhi)
const
633 const Vertex *pBestVertex(
nullptr);
634 float bestVertexDr(std::numeric_limits<float>::max());
637 this->
GetBestVertex(vertexVector, pBestVertex, bestVertexDr);
642 for (
const Vertex *
const pVertex : vertexVector)
644 if (pVertex == pBestVertex)
654 float separation(0.f), axisHits(0.f);
659 if (pBestVertex && (bestVertexDr < maxRadius))
661 if (coinFlip(generator))
671 if (pBestVertex && (bestVertexDr < maxRadius))
673 if (coinFlip(generator))
689 const Vertex *
const pVertex1,
const Vertex *
const pVertex2,
const KDTreeMap &kdTreeMap,
float &separation,
float &axisHits)
const
702 axisHits = separation > std::numeric_limits<float>::epsilon() ? axisHits / separation : 0.f;
724 const float xMin{std::min({point1.
GetX(), point2.
GetX(), point3.
GetX(), point4.
GetX()})};
725 const float xMax{std::max({point1.
GetX(), point2.
GetX(), point3.
GetX(), point4.
GetX()})};
726 const float zMin{std::min({point1.
GetZ(), point2.
GetZ(), point3.
GetZ(), point4.
GetZ()})};
727 const float zMax{std::max({point1.
GetZ(), point2.
GetZ(), point3.
GetZ(), point4.
GetZ()})};
730 KDTreeBox searchBox(xMin, zMin, xMax, zMax);
732 kdTree.
search(searchBox, found);
738 bool inBox = this->
IsHitInBox(hitPos, point1, point2, point3, point4);
750 bool b1 = std::signbit(((point2 - point1).GetCrossProduct(point2 - hitPos)).GetY());
751 bool b2 = std::signbit(((point4 - point3).GetCrossProduct(point4 - hitPos)).GetY());
756 bool b3 = std::signbit(((point3 - point1).GetCrossProduct(point3 - hitPos)).GetY());
757 bool b4 = std::signbit(((point4 - point2).GetCrossProduct(point4 - hitPos)).GetY());
782 for (
const Vertex *
const pVertex : vertexVector)
784 float mcVertexDr(std::numeric_limits<float>::max());
785 for (
const MCParticle *
const pMCTarget : mcTargetVector)
788 (
m_testBeamMode && std::fabs(pMCTarget->GetParticleId()) == 11) ? pMCTarget->GetVertex() : pMCTarget->GetEndpoint());
791 const float dr = (mcTargetCorrectedPosition - pVertex->GetPosition()).GetMagnitude();
797 if (mcVertexDr < bestVertexDr)
799 bestVertexDr = mcVertexDr;
800 pBestVertex = pVertex;
811 featureVector.push_back(
static_cast<double>(vertexFeatureInfo.
m_beamDeweighting));
812 featureVector.push_back(
static_cast<double>(vertexFeatureInfo.
m_energyKick));
813 featureVector.push_back(
static_cast<double>(vertexFeatureInfo.
m_globalAsymmetry));
814 featureVector.push_back(
static_cast<double>(vertexFeatureInfo.
m_localAsymmetry));
815 featureVector.push_back(
static_cast<double>(vertexFeatureInfo.
m_showerAsymmetry));
819 featureVector.push_back(
static_cast<double>(vertexFeatureInfo.
m_dEdxAsymmetry));
820 featureVector.push_back(
static_cast<double>(vertexFeatureInfo.
m_vertexEnergy));
824 featureVector.push_back(
static_cast<double>(vertexFeatureInfo.
m_rPhiFeature));
832 featureVector.push_back(
static_cast<double>(vertexSharedFeatureInfo.
m_separation));
833 featureVector.push_back(
static_cast<double>(vertexSharedFeatureInfo.
m_axisHits));
841 if (pFavouriteVertex)
845 for (
const Vertex *
const pVertex : vertexVector)
849 const float rPhiScore(vertexFeatureInfoMap.at(pVertex).m_rPhiFeature);
850 finalVertexScoreList.emplace_back(pVertex, rPhiScore);
864 for (
AlgorithmTool *
const pAlgorithmTool : algorithmToolVector)
883 std::cout <<
"TrainedVertexSelectionAlgorithm: TrainingOutputFileRegion and TrainingOutputFileVertex are required for training set "
884 <<
"mode" << std::endl;
885 return STATUS_CODE_INVALID_PARAMETER;
895 std::cout <<
"TrainedVertexSelectionAlgorithm: MCParticleListName and CaloHitListName are required for training set mode" << std::endl;
896 return STATUS_CODE_INVALID_PARAMETER;
956 std::cout <<
"TrainedVertexSelectionAlgorithm: WARNING -- Producing training sample using incorrect legacy event shapes, consider turning LegacyEventShapes off"
Header file for the kd tree linker algo template class.
Header file for the cluster helper class.
Header file for the file helper class.
Header file for the geometry helper class.
Header file for the interaction type helper class.
Header file for the lar monte carlo particle helper helper class.
#define PANDORA_THROW_RESULT_IF(StatusCode1, Operator, Command)
#define PANDORA_RETURN_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
#define PANDORA_RETURN_RESULT_IF(StatusCode1, Operator, Command)
Header file for the trained vertex selection algorithm class.
static pandora::StatusCode GetList(const pandora::Algorithm &algorithm, const std::string &listName, const T *&pT)
Get a named list.
Box structure used to define 2D field. It's used in KDTree building step to divide the detector space...
void build(std::vector< KDTreeNodeInfoT< DATA, DIM > > &eltList, const KDTreeBoxT< DIM > ®ion)
Build the KD tree from the "eltList" in the space define by "region".
void search(const KDTreeBoxT< DIM > &searchBox, std::vector< KDTreeNodeInfoT< DATA, DIM > > &resRecHitList)
Search in the KDTree for all points that would be contained in the given searchbox The founded points...
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 float GetLength(const pandora::Cluster *const pCluster)
Get length of cluster.
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.
static float GetWireZPitch(const pandora::Pandora &pandora, const float maxWirePitchDiscrepancy=0.01)
Return the wire pitch.
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
InteractionType
InteractionType enum.
static InteractionType GetInteractionType(const pandora::MCParticleList &mcPrimaryList)
Get the interaction type of an event.
static std::string ToString(const InteractionType interactionType)
Get a string representation of an interaction type.
static bool SortByMomentum(const pandora::MCParticle *const pLhs, const pandora::MCParticle *const pRhs)
Sort mc particles by their momentum.
static void SelectReconstructableMCParticles(const pandora::MCParticleList *pMCParticleList, const pandora::CaloHitList *pCaloHitList, const PrimaryParameters ¶meters, std::function< bool(const pandora::MCParticle *const)> fCriteria, MCContributionMap &selectedMCParticlesToHitsMap)
Select target, reconstructable mc particles that match given criteria.
std::unordered_map< const pandora::MCParticle *, pandora::CaloHitList > MCContributionMap
static bool IsTriggeredBeamParticle(const pandora::MCParticle *const pMCParticle)
Returns true if passed a primary triggered beam MCParticle.
static void GetTrueTestBeamParticles(const pandora::MCParticleList *const pMCParticleList, pandora::MCParticleVector &trueTestBeamParticles)
Get triggered test beam MC particles from an input MC particle list.
static void GetTrueNeutrinos(const pandora::MCParticleList *const pMCParticleList, pandora::MCParticleVector &trueNeutrinos)
Get neutrino MC particles from an input MC particle list.
static bool IsBeamNeutrinoFinalState(const pandora::MCParticle *const pMCParticle)
Returns true if passed a primary neutrino final state MCParticle.
MvaTypes::MvaFeatureVector MvaFeatureVector
static MvaFeatureVector ConcatenateFeatureLists()
Recursively concatenate vectors of features (terminating method)
static pandora::StatusCode AddFeatureToolToVector(pandora::AlgorithmTool *const pFeatureTool, MvaFeatureToolVector< Ts... > &featureToolVector)
Add a feature tool to a vector of feature tools.
static pandora::StatusCode ProduceTrainingExample(const std::string &trainingOutputFile, const bool result, TCONTAINER &&featureContainer)
Produce a training example with the given features and result.
Event feature info class.
float m_eventShoweryness
The event showeryness feature.
float m_eventArea
The area of the event.
unsigned int m_nCandidates
The total number of vertex candidates.
float m_eventEnergy
The event energy.
unsigned int m_nHits
The number of hits in the event.
unsigned int m_nClusters
The number of clusters in the event.
float m_longitudinality
The longitudinality of the event.
Vertex feature info class.
float m_globalAsymmetry
The global asymmetry feature.
float m_beamDeweighting
The beam deweighting feature.
float m_showerAsymmetry
The shower asymmetry feature.
float m_dEdxAsymmetry
The dE/dx asymmetry feature.
float m_rPhiFeature
The r/phi feature.
float m_vertexEnergy
The vertex energy feature.
float m_energyKick
The energy kick feature.
float m_localAsymmetry
The local asymmetry feature.
Shared vertex feature info class.
float m_axisHits
The hit density along the axis between the two vertices.
float m_separation
The distance between the two vertices.
float m_showerAsymmetryConstant
The shower asymmetry constant for the initial region score list.
void ProduceTrainingSets(const pandora::VertexVector &vertexVector, const pandora::VertexVector &bestRegionVertices, VertexFeatureInfoMap &vertexFeatureInfoMap, const LArMvaHelper::MvaFeatureVector &eventFeatureList, const KDTreeMap &kdTreeMap) const
Produce the region and vertex training sets.
bool m_legacyVariables
Whether to only use the old variables.
void AddEventFeaturesToVector(const EventFeatureInfo &eventFeatureInfo, LArMvaHelper::MvaFeatureVector &featureVector) const
Add the event features to a vector in the correct order.
EventFeatureInfo CalculateEventFeatures(const pandora::ClusterList &clusterListU, const pandora::ClusterList &clusterListV, const pandora::ClusterList &clusterListW, const pandora::VertexVector &vertexVector) const
Calculate the event parameters.
float m_rPhiFineTuningRadius
The maximum distance the r/phi tune can move a vertex.
float m_showerClusteringDistance
The shower clustering distance.
float m_regionRadius
The radius for a vertex region.
pandora::StringVector m_inputClusterListNames
The list of cluster list names.
std::vector< HitKDNode2D > HitKDNode2DList
void IncrementShoweryParameters(const pandora::ClusterList &clusterList, unsigned int &nShoweryHits, unsigned int &nHits, float &eventEnergy) const
Increment the showery hit parameters for a cluster list.
bool IsClusterShowerLike(const pandora::Cluster *const pCluster) const
Find whether a cluster is shower-like.
unsigned int m_minClusterCaloHits
The min number of hits parameter in the energy score.
void IncrementSharedAxisValues(const pandora::CartesianVector pos1, const pandora::CartesianVector pos2, HitKDTree2D &kdTree, float &axisHits) const
Increments the axis hits information for one view.
float GetCoordinateSpan(const pandora::InputFloat &minCoord, const pandora::InputFloat &maxCoord) const
Get the coordinate span.
bool m_legacyEventShapes
Whether to use the old event shapes calculation.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
void PopulateFinalVertexScoreList(const VertexFeatureInfoMap &vertexFeatureInfoMap, const pandora::Vertex *const pFavouriteVertex, const pandora::VertexVector &vertexVector, VertexScoreList &finalVertexScoreList) const
Populate the final vertex score list using the r/phi score to find the best vertex in the vicinity.
void PopulateVertexFeatureInfoMap(const BeamConstants &beamConstants, const ClusterListMap &clusterListMap, const SlidingFitDataListMap &slidingFitDataListMap, const ShowerClusterListMap &showerClusterListMap, const KDTreeMap &kdTreeMap, const pandora::Vertex *const pVertex, VertexFeatureInfoMap &vertexFeatureInfoMap) const
Populate the vertex feature info map for a given vertex.
void GetBestRegionVertices(VertexScoreList &initialScoreList, pandora::VertexVector &bestRegionVertices) const
Get the list of top-N separated vertices.
void GetSharedFeatures(const pandora::Vertex *const pVertex1, const pandora::Vertex *const pVertex2, const KDTreeMap &kdTreeMap, float &separation, float &axisHits) const
Calculates the shared features of a pair of vertex candidates.
std::string m_mcParticleListName
The MC particle list for creating training examples.
void CalculateRPhiScores(pandora::VertexVector &vertexVector, VertexFeatureInfoMap &vertexFeatureInfoMap, const KDTreeMap &kdTreeMap) const
Calculate the r/phi scores for the vertices in a vector, possibly erasing those that fail the fast sc...
void AddVertexFeaturesToVector(const VertexFeatureInfo &vertexFeatureInfo, LArMvaHelper::MvaFeatureVector &featureVector, const bool useRPhi) const
Add the vertex features to a vector in the correct order.
VertexFeatureTool::FeatureToolVector m_featureToolVector
The feature tool vector.
void UpdateSpanCoordinate(const float minPositionCoord, const float maxPositionCoord, pandora::InputFloat &minCoord, pandora::InputFloat &maxCoord) const
Update the min/max coordinate spans.
unsigned int m_slidingFitWindow
The layer window for the sliding linear fits.
std::string GetInteractionType() const
Get the interaction type string.
bool m_trainingSetMode
Whether to train.
bool m_useShowerClusteringApproximation
Whether to use the shower clustering distance approximation.
void GetLegacyEventShapeFeatures(const pandora::ClusterList &clusterList, float &eventVolume, float &longitudinality) const
Get the event shape features.
std::pair< pandora::CartesianVector, pandora::CartesianVector > ClusterEndPoints
float m_globalAsymmetryConstant
The global asymmetry constant for the initial region score list.
TrainedVertexSelectionAlgorithm()
Default constructor.
bool AddClusterToShower(const ClusterEndPointsMap &clusterEndPointsMap, pandora::ClusterList &availableShowerLikeClusters, const pandora::Cluster *const pCluster, pandora::ClusterList &showerCluster) const
Try to add an available cluster to a given shower cluster, using shower clustering approximation.
void GetShowerLikeClusterEndPoints(const pandora::ClusterList &clusterList, pandora::ClusterList &showerLikeClusters, ClusterEndPointsMap &clusterEndPointsMap) const
Add the endpoints of any shower-like clusters to the map.
std::unordered_map< const pandora::CaloHit *, const pandora::Cluster * > HitToClusterMap
std::map< const pandora::Vertex *const, VertexFeatureInfo > VertexFeatureInfoMap
std::string m_trainingOutputFileRegion
The training output file for the region mva.
void AddSharedFeaturesToVector(const VertexSharedFeatureInfo &vertexSharedFeatureInfo, LArMvaHelper::MvaFeatureVector &featureVector) const
Add the shared features to a vector in the correct order.
void CalculateShowerClusterList(const pandora::ClusterList &inputClusterList, ShowerClusterList &showerClusterList) const
Calculate the shower cluster map for a cluster list.
const pandora::Vertex * ProduceTrainingExamples(const pandora::VertexVector &vertexVector, const VertexFeatureInfoMap &vertexFeatureInfoMap, std::bernoulli_distribution &coinFlip, std::mt19937 &generator, const std::string &interactionType, const std::string &trainingOutputFile, const LArMvaHelper::MvaFeatureVector &eventFeatureList, const KDTreeMap &kdTreeMap, const float maxRadius, const bool useRPhi) const
Produce a set of training examples for a binary classifier.
std::map< const pandora::Cluster *const, ClusterEndPoints > ClusterEndPointsMap
float m_mcVertexXCorrection
The correction to the x-coordinate of the MC vertex position.
float m_maxTrueVertexRadius
The maximum distance at which a vertex candidate can be considered the 'true' vertex.
bool m_useRPhiFeatureForRegion
Whether to use the r/phi feature for the region vertex.
void GetBestVertex(const pandora::VertexVector &vertexVector, const pandora::Vertex *&pBestVertex, float &bestVertexDr) const
Use the MC information to get the best vertex from a list.
void PopulateKdTree(const pandora::ClusterList &clusterList, HitKDTree2D &kdTree, HitToClusterMap &hitToClusterMap) const
Populate kd tree with information about hits in a provided list of clusters.
std::string m_trainingOutputFileVertex
The training output file for the vertex mva.
float m_minShowerSpineLength
The minimum length at which all are considered to be tracks.
std::string m_caloHitListName
The 2D CaloHit list name.
float m_localAsymmetryConstant
The local asymmetry constant for the initial region score list.
bool m_allowClassifyDuringTraining
Whether classification is allowed during training.
bool m_dropFailedRPhiFastScoreCandidates
Whether to drop candidates that fail the r/phi fast score test.
void PopulateInitialScoreList(VertexFeatureInfoMap &vertexFeatureInfoMap, const pandora::Vertex *const pVertex, VertexScoreList &initialScoreList) const
Populate the initial vertex score list for a given vertex.
float m_energyKickConstant
The energy kick constant for the initial region score list.
unsigned int m_minShowerClusterHits
The minimum number of shower cluster hits.
bool IsHitInBox(const pandora::CartesianVector &hitPos, const pandora::CartesianVector &point1, const pandora::CartesianVector &point2, const pandora::CartesianVector &point3, const pandora::CartesianVector &point4) const
Determines whether a hit lies within the box defined by four other positions.
bool m_testBeamMode
Test beam mode.
float m_beamDeweightingConstant
The beam deweighting constant for the initial region score list.
void GetEventShapeFeatures(const ClusterListMap &clusterListMap, float &eventArea, float &longitudinality) const
Get the event shape features.
void Get2DSpan(const pandora::ClusterList &clusterList, float &xSpan, float &zSpan) const
Get the coordinate span in one view.
VertexSelectionBaseAlgorithm class.
std::map< pandora::HitType, const SlidingFitDataList > SlidingFitDataListMap
Map of sliding fit data lists for passing to tools.
std::vector< VertexScore > VertexScoreList
std::map< pandora::HitType, const pandora::ClusterList & > ClusterListMap
Map array of cluster lists for passing to tools.
std::map< pandora::HitType, const std::reference_wrapper< HitKDTree2D > > KDTreeMap
Map array of hit kd trees for passing to tools.
float GetBeamDeweightingScore(const BeamConstants &beamConstants, const pandora::Vertex *const pVertex) const
Get the beam deweighting score for a vertex.
std::map< pandora::HitType, const ShowerClusterList > ShowerClusterListMap
Map of shower cluster lists for passing to tools.
float GetVertexEnergy(const pandora::Vertex *const pVertex, const KDTreeMap &kdTreeMap) const
Calculate the energy of a vertex candidate by summing values from all three planes.
bool IsBeamModeOn() const
Whether algorithm is running in beam mode, assuming neutrinos travel in positive z-direction.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
std::vector< ShowerCluster > ShowerClusterList
float GetX() const
Get the cartesian x coordinate.
float GetZ() const
Get the cartesian z coordinate.
float GetY() const
Get the cartesian y coordinate.
const OrderedCaloHitList & GetOrderedCaloHitList() const
Get the ordered calo hit list.
int GetParticleId() const
Get the particle id flag.
Calo hit lists arranged by pseudo layer.
const_iterator end() const
Returns a const iterator referring to the past-the-end element in the ordered calo hit list.
const_iterator begin() const
Returns a const iterator referring to the first element in the ordered calo hit list.
TheList::const_iterator const_iterator
void FillCaloHitList(CaloHitList &caloHitList) const
Fill a provided calo hit list with all the calo hits in the ordered calo hit list.
const Pandora & GetPandora() const
Get the associated pandora instance.
const CartesianVector & GetPosition() const
Get the vertex position.
static StatusCode ReadVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, std::vector< T > &vector)
Read a vector of values from a (space separated) list in an xml element.
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
static StatusCode ProcessAlgorithmToolList(const Algorithm &algorithm, const TiXmlHandle &xmlHandle, const std::string &listName, AlgorithmToolVector &algorithmToolVector)
Process a list of algorithms tools in an xml file.
KDTreeBox fill_and_bound_2d_kd_tree(const MANAGED_CONTAINER< const T * > &points, std::vector< KDTreeNodeInfoT< const T *, 2 > > &nodes)
fill_and_bound_2d_kd_tree
KDTreeBox build_2d_kd_search_region(const pandora::CaloHit *const point, const float x_span, const float z_span)
build_2d_kd_search_region
MANAGED_CONTAINER< const MCParticle * > MCParticleList
std::vector< const CaloHit * > CaloHitVector
MANAGED_CONTAINER< const Cluster * > ClusterList
std::vector< AlgorithmTool * > AlgorithmToolVector
std::unordered_set< const Cluster * > ClusterSet
MANAGED_CONTAINER< const CaloHit * > CaloHitList
std::vector< float > FloatVector
std::vector< const MCParticle * > MCParticleVector
StatusCode
The StatusCode enum.
std::vector< const Vertex * > VertexVector