9 #include "Pandora/AlgorithmHeaders.h" 21 ThreeDLongitudinalTracksAlgorithm::ThreeDLongitudinalTracksAlgorithm() :
22 m_nMaxTensorToolRepeats(1000),
23 m_vertexChi2Cut(10.
f),
24 m_reducedChi2Cut(5.
f),
52 for (
unsigned int iPermutation = 0; iPermutation < 4; ++iPermutation)
54 const bool isForwardU((1 == iPermutation) ?
false :
true);
55 const bool isForwardV((2 == iPermutation) ?
false :
true);
56 const bool isForwardW((3 == iPermutation) ?
false :
true);
69 const float halfLengthSquaredU(0.25*(vtxU - endU).GetMagnitudeSquared());
70 const float halfLengthSquaredV(0.25*(vtxV - endV).GetMagnitudeSquared());
71 const float halfLengthSquaredW(0.25*(vtxW - endW).GetMagnitudeSquared());
73 CartesianVector vtxMergedU(0.
f,0.
f,0.
f), vtxMergedV(0.
f,0.
f,0.
f), vtxMergedW(0.
f,0.
f,0.
f);
74 CartesianVector endMergedU(0.
f,0.
f,0.
f), endMergedV(0.
f,0.
f,0.
f), endMergedW(0.
f,0.
f,0.
f);
80 vtxMergedV, vtxMergedW, vtxChi2);
85 if (((vtxMergedU - vtxU).GetMagnitudeSquared() >
std::min(halfLengthSquaredU, (vtxMergedU - endU).GetMagnitudeSquared())) ||
86 ((vtxMergedV - vtxV).GetMagnitudeSquared() >
std::min(halfLengthSquaredV, (vtxMergedV - endV).GetMagnitudeSquared())) ||
87 ((vtxMergedW - vtxW).GetMagnitudeSquared() >
std::min(halfLengthSquaredW, (vtxMergedW - endW).GetMagnitudeSquared())))
91 endMergedV, endMergedW, endChi2);
96 if (((endMergedU - endU).GetMagnitudeSquared() >
std::min(halfLengthSquaredU, (endMergedU - vtxU).GetMagnitudeSquared())) ||
97 ((endMergedV - endV).GetMagnitudeSquared() >
std::min(halfLengthSquaredV, (endMergedV - vtxV).GetMagnitudeSquared())) ||
98 ((endMergedW - endW).GetMagnitudeSquared() >
std::min(halfLengthSquaredW, (endMergedW - vtxW).GetMagnitudeSquared())))
103 CartesianVector position3D(0.
f,0.
f,0.
f);
104 CartesianPointVector vtxList3D, endList3D;
107 vtxList3D.push_back(position3D);
110 vtxList3D.push_back(position3D);
113 vtxList3D.push_back(position3D);
116 endList3D.push_back(position3D);
119 endList3D.push_back(position3D);
122 endList3D.push_back(position3D);
127 const CartesianVector &vtxMerged3D(*iterI);
131 const CartesianVector &endMerged3D(*iterJ);
135 vtxMerged3D, endMerged3D, overlapResult);
139 bestOverlapResult = overlapResult;
161 const unsigned int nSamplingPoints =
static_cast<unsigned int>((endMerged3D - vtxMerged3D).GetMagnitude()/
m_samplingPitch);
163 if(0 == nSamplingPoints)
167 float deltaChi2(0.
f), totalChi2(0.
f);
168 unsigned int nMatchedSamplingPoints(0);
170 for (
unsigned int n = 0;
n < nSamplingPoints; ++
n)
172 const float alpha((0.5
f + static_cast<float>(
n)) / static_cast<float>(nSamplingPoints));
173 const CartesianVector linearU(vtxMergedU + (endMergedU - vtxMergedU) * alpha);
174 const CartesianVector linearV(vtxMergedV + (endMergedV - vtxMergedV) * alpha);
175 const CartesianVector linearW(vtxMergedW + (endMergedW - vtxMergedW) * alpha);
177 CartesianVector posU(0.
f,0.
f,0.
f), posV(0.
f,0.
f,0.
f), posW(0.
f,0.
f,0.
f);
185 CartesianVector mergedU(0.
f,0.
f,0.
f), mergedV(0.
f,0.
f,0.
f), mergedW(0.
f,0.
f,0.
f);
189 ++nMatchedSamplingPoints;
191 totalChi2 += deltaChi2;
194 if (nMatchedSamplingPoints > 0)
195 overlapResult =
TrackOverlapResult(nMatchedSamplingPoints, nSamplingPoints, totalChi2);
202 unsigned int repeatCounter(0);
224 AlgorithmToolVector algorithmToolVector;
225 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ProcessAlgorithmToolList(*
this, xmlHandle,
226 "TrackTools", algorithmToolVector));
232 if (NULL == pLongitudinalTensorTool)
233 return STATUS_CODE_INVALID_PARAMETER;
238 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
241 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
244 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
247 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
251 return STATUS_CODE_INVALID_PARAMETER;
LongitudinalOverlapResult class.
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.
unsigned int GetNMatchedSamplingPoints() const
Get the number of matched sampling points.
bool IsInitialized() const
Whether the track overlap result has been initialized.
void CalculateOverlapResult(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW)
Calculate cluster overlap result and store in tensor.
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
TensorToolVector m_algorithmToolVector
The algorithm tool vector.
const TwoDSlidingFitResult & GetCachedSlidingFitResult(const pandora::Cluster *const pCluster) const
Get a sliding fit result from the algorithm cache.
Header file for the geometry helper class.
float m_samplingPitch
Pitch used to generate sampling points along tracks.
void SetOverlapResult(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW, const OverlapResult &overlapResult)
Set overlap result.
float m_reducedChi2Cut
The maximum allowed chi2 for associating hit positions from three views.
Header file for the cluster helper class.
TensorType m_overlapTensor
The overlap tensor.
pandora::CartesianVector GetGlobalMinLayerPosition() const
Get global position corresponding to the fit result in minimum fit layer.
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.
TrackOverlapResult class.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
unsigned int m_nMaxTensorToolRepeats
The maximum number of repeat loops over tensor tools.
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
LongitudinalTensorTool class.
pandora::StatusCode GetGlobalFitProjection(const pandora::CartesianVector &inputPosition, pandora::CartesianVector &projectedPosition) const
Get projected position on global fit for a given position vector.
float m_vertexChi2Cut
The maximum allowed chi2 for associating end points from three views.
pandora::CartesianVector GetGlobalMaxLayerPosition() const
Get global position corresponding to the fit result in maximum fit layer.
TwoDSlidingFitResult class.
void ExamineTensor()
Examine contents of tensor, collect together best-matching 2D particles and modify clusters as requir...
Header file for the three dimensional longitudinal tracks algorithm class.