53 for (
unsigned int iPermutation = 0; iPermutation < 4; ++iPermutation)
55 const bool isForwardU((1 == iPermutation) ?
false :
true);
56 const bool isForwardV((2 == iPermutation) ?
false :
true);
57 const bool isForwardW((3 == iPermutation) ?
false :
true);
70 const float halfLengthSquaredU(0.25 * (vtxU - endU).GetMagnitudeSquared());
71 const float halfLengthSquaredV(0.25 * (vtxV - endV).GetMagnitudeSquared());
72 const float halfLengthSquaredW(0.25 * (vtxW - endW).GetMagnitudeSquared());
74 CartesianVector vtxMergedU(0.f, 0.f, 0.f), vtxMergedV(0.f, 0.f, 0.f), vtxMergedW(0.f, 0.f, 0.f);
75 CartesianVector endMergedU(0.f, 0.f, 0.f), endMergedV(0.f, 0.f, 0.f), endMergedW(0.f, 0.f, 0.f);
77 float vtxChi2(std::numeric_limits<float>::max());
78 float endChi2(std::numeric_limits<float>::max());
81 this->
GetPandora(),
TPC_VIEW_U,
TPC_VIEW_V,
TPC_VIEW_W, vtxU, vtxV, vtxW, vtxMergedU, vtxMergedV, vtxMergedW, vtxChi2);
86 if (((vtxMergedU - vtxU).GetMagnitudeSquared() > std::min(halfLengthSquaredU, (vtxMergedU - endU).GetMagnitudeSquared())) ||
87 ((vtxMergedV - vtxV).GetMagnitudeSquared() > std::min(halfLengthSquaredV, (vtxMergedV - endV).GetMagnitudeSquared())) ||
88 ((vtxMergedW - vtxW).GetMagnitudeSquared() > std::min(halfLengthSquaredW, (vtxMergedW - endW).GetMagnitudeSquared())))
92 this->
GetPandora(),
TPC_VIEW_U,
TPC_VIEW_V,
TPC_VIEW_W, endU, endV, endW, endMergedU, endMergedV, endMergedW, endChi2);
97 if (((endMergedU - endU).GetMagnitudeSquared() > std::min(halfLengthSquaredU, (endMergedU - vtxU).GetMagnitudeSquared())) ||
98 ((endMergedV - endV).GetMagnitudeSquared() > std::min(halfLengthSquaredV, (endMergedV - vtxV).GetMagnitudeSquared())) ||
99 ((endMergedW - endW).GetMagnitudeSquared() > std::min(halfLengthSquaredW, (endMergedW - vtxW).GetMagnitudeSquared())))
108 vtxList3D.push_back(position3D);
111 vtxList3D.push_back(position3D);
114 vtxList3D.push_back(position3D);
117 endList3D.push_back(position3D);
120 endList3D.push_back(position3D);
123 endList3D.push_back(position3D);
126 for (CartesianPointVector::const_iterator iterI = vtxList3D.begin(), iterEndI = vtxList3D.end(); iterI != iterEndI; ++iterI)
130 for (CartesianPointVector::const_iterator iterJ = endList3D.begin(), iterEndJ = endList3D.end(); iterJ != iterEndJ; ++iterJ)
135 this->
CalculateOverlapResult(slidingFitResultU, slidingFitResultV, slidingFitResultW, vtxMerged3D, endMerged3D, overlapResult);
139 bestOverlapResult = overlapResult;
162 const unsigned int nSamplingPoints =
static_cast<unsigned int>((endMerged3D - vtxMerged3D).GetMagnitude() /
m_samplingPitch);
164 if (0 == nSamplingPoints)
168 float deltaChi2(0.f), totalChi2(0.f);
169 unsigned int nMatchedSamplingPoints(0);
171 for (
unsigned int n = 0; n < nSamplingPoints; ++n)
173 const float alpha((0.5f +
static_cast<float>(n)) /
static_cast<float>(nSamplingPoints));
174 const CartesianVector linearU(vtxMergedU + (endMergedU - vtxMergedU) * alpha);
175 const CartesianVector linearV(vtxMergedV + (endMergedV - vtxMergedV) * alpha);
176 const CartesianVector linearW(vtxMergedW + (endMergedW - vtxMergedW) * alpha);
178 CartesianVector posU(0.f, 0.f, 0.f), posV(0.f, 0.f, 0.f), posW(0.f, 0.f, 0.f);
186 CartesianVector mergedU(0.f, 0.f, 0.f), mergedV(0.f, 0.f, 0.f), mergedW(0.f, 0.f, 0.f);
190 ++nMatchedSamplingPoints;
192 totalChi2 += deltaChi2;
195 if (nMatchedSamplingPoints > 0)
196 overlapResult =
TrackOverlapResult(nMatchedSamplingPoints, nSamplingPoints, totalChi2);
228 for (AlgorithmToolVector::const_iterator iter = algorithmToolVector.begin(), iterEnd = algorithmToolVector.end(); iter != iterEnd; ++iter)
232 if (!pLongitudinalTensorTool)
233 return STATUS_CODE_INVALID_PARAMETER;
248 return STATUS_CODE_INVALID_PARAMETER;
static void MergeThreePositions(const pandora::Pandora &pandora, const pandora::HitType view1, const pandora::HitType view2, const pandora::HitType view3, const pandora::CartesianVector &position1, const pandora::CartesianVector &position2, const pandora::CartesianVector &position3, pandora::CartesianVector &outputU, pandora::CartesianVector &outputV, pandora::CartesianVector &outputW, float &chiSquared)
Merge 2D positions from three views to give unified 2D positions for each view.
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
static void MergeTwoPositions3D(const pandora::Pandora &pandora, const pandora::HitType view1, const pandora::HitType view2, const pandora::CartesianVector &position1, const pandora::CartesianVector &position2, pandora::CartesianVector &position3D, float &chiSquared)
Merge 2D positions from two views to give unified 3D position.
MatchingType & GetMatchingControl()
Get the matching control.
const TwoDSlidingFitResult & GetCachedSlidingFitResult(const pandora::Cluster *const pCluster) const
Get a sliding fit result from the algorithm cache.
void ExamineOverlapContainer()
Examine contents of overlap container, collect together best-matching 2D particles and modify cluster...
void CalculateOverlapResult(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW)
Calculate cluster overlap result and store in container.
float m_reducedChi2Cut
The maximum allowed chi2 for associating hit positions from three views.
float m_vertexChi2Cut
The maximum allowed chi2 for associating end points from three views.
unsigned int m_nMaxTensorToolRepeats
The maximum number of repeat loops over tensor tools.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
bool IsInitialized() const
Whether the track overlap result has been initialized.
unsigned int GetNMatchedSamplingPoints() const
Get the number of matched sampling points.
pandora::CartesianVector GetGlobalMinLayerPosition() const
Get global position corresponding to the fit result in minimum fit layer.
pandora::CartesianVector GetGlobalMaxLayerPosition() const
Get global position corresponding to the fit result in maximum fit layer.
pandora::StatusCode GetGlobalFitProjection(const pandora::CartesianVector &inputPosition, pandora::CartesianVector &projectedPosition) const
Get projected position on global fit for a given position vector.