9 #include "Objects/Cluster.h" 22 float SimpleCone::GetMeanRT(
const Cluster *
const pCluster)
const 24 CartesianPointVector hitPositionVector;
25 LArClusterHelper::GetCoordinateVector(pCluster, hitPositionVector);
28 const unsigned int nClusterHits(pCluster->GetNCaloHits());
30 for (
const CartesianVector &hitPosition : hitPositionVector)
32 const CartesianVector displacement(hitPosition - this->GetConeApex());
33 const float rT(displacement.GetCrossProduct(this->GetConeDirection()).GetMagnitude());
37 return ((nClusterHits > 0) ? rTSum /
static_cast<float>(nClusterHits) : 0.
f);
42 float SimpleCone::GetBoundedHitFraction(
const Cluster *
const pCluster,
const float coneLength,
const float coneTanHalfAngle)
const 44 CartesianPointVector hitPositionVector;
45 LArClusterHelper::GetCoordinateVector(pCluster, hitPositionVector);
47 unsigned int nMatchedHits(0);
48 const unsigned int nClusterHits(pCluster->GetNCaloHits());
50 for (
const CartesianVector &hitPosition : hitPositionVector)
52 const CartesianVector displacement(hitPosition - this->GetConeApex());
53 const float rL(displacement.GetDotProduct(this->GetConeDirection()));
55 if ((rL < 0.
f) || (rL > coneLength))
58 const float rT(displacement.GetCrossProduct(this->GetConeDirection()).GetMagnitude());
60 if (rL * coneTanHalfAngle > rT)
64 return ((nClusterHits > 0) ?
static_cast<float>(nMatchedHits) / static_cast<float>(nClusterHits) : 0.f);
71 ThreeDSlidingConeFitResult::ThreeDSlidingConeFitResult(
const T *
const pT,
const unsigned int slidingFitWindow,
const float slidingFitLayerPitch) :
83 const int nSteps(static_cast<int>((maxLayerPosition3D - minLayerPosition3D).GetMagnitude() / slidingFitLayerPitch));
85 for (
int iStep = 0; iStep <= nSteps; ++iStep)
89 const float rL((static_cast<float>(iStep) + 0.5
f) * slidingFitLayerPitch);
90 CartesianVector fitPosition3D(0.
f, 0.
f, 0.
f), fitDirection3D(0.
f, 0.
f, 0.
f);
99 if (!contributionMap1.count(fitResult1.GetLayer(rL)) && !contributionMap2.count(fitResult2.GetLayer(rL)))
102 (void)
m_trackStateMap.insert(TrackStateMap::value_type(iStep, TrackState(fitPosition3D, fitDirection3D)));
104 catch (
const StatusCodeException &)
117 const unsigned int nLayers(trackStateMap.size());
119 if (nLayers + 1 < nLayersForConeFit + nCones)
120 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
123 const unsigned int coneInterval((nCones > 1) ? (nLayers - nLayersForConeFit) / (nCones - 1) : 1);
126 const bool isForward(coneDisplacement.GetZ() > std::numeric_limits<float>::epsilon());
127 const unsigned int coneOffset1((nLayers - nLayersForConeFit - (nCones - 1) * coneInterval) / 2);
128 const unsigned int coneOffset2((1 == nLayers % 2) && isForward ? 1 : 0);
129 const unsigned int coneOffset(coneOffset1 + coneOffset2);
132 CartesianVector directionSum(0.
f, 0.
f, 0.
f);
133 const float clusterLength((trackStateMap.begin()->second.GetPosition() - trackStateMap.rbegin()->second.GetPosition()).GetMagnitude());
134 const float lengthStep{(nCones > 1) ? 0.5
f * clusterLength / (nCones - 1) : 0.5f * clusterLength};
135 const float angleStep{(nCones > 1) ? 0.5
f * tanHalfAngle / (nCones - 1) : 0.5f * tanHalfAngle};
137 unsigned int nConeSamplingSteps(0);
141 if (nConeSamplingSteps >= nCones)
144 trackStateList.push_back(iter->second);
145 directionSum += iter->second.GetMomentum();
147 const unsigned int beginDistance(static_cast<unsigned int>(std::distance(trackStateMap.begin(), iter)));
149 if (beginDistance + 1 < nLayersForConeFit)
152 const TrackState &maxLayerTrackState(trackStateList.back());
153 const TrackState &minLayerTrackState(trackStateList.front());
155 if ((beginDistance + 1 >= nLayersForConeFit + coneOffset) && (beginDistance + 1 - nLayersForConeFit - coneOffset) % coneInterval == 0)
157 const CartesianVector &minLayerApex(minLayerTrackState.GetPosition());
158 const CartesianVector &maxLayerApex(maxLayerTrackState.GetPosition());
160 const CartesianVector minLayerDirection(directionSum.GetUnitVector());
161 const CartesianVector maxLayerDirection(directionSum.GetUnitVector() * -1.f);
164 ++nConeSamplingSteps;
170 simpleConeList.push_back(
SimpleCone(minLayerApex, minLayerDirection, clusterLength, tanHalfAngle));
174 const float stepConeLength{clusterLength - (nConeSamplingSteps - 1) * lengthStep};
175 const float stepTanHalfAngle{tanHalfAngle - (nCones - nConeSamplingSteps) * angleStep};
176 simpleConeList.push_back(
SimpleCone(minLayerApex, minLayerDirection, stepConeLength, stepTanHalfAngle));
184 simpleConeList.push_back(
SimpleCone(maxLayerApex, maxLayerDirection, clusterLength, tanHalfAngle));
188 const float stepConeLength{clusterLength - (nCones - nConeSamplingSteps) * lengthStep};
189 const float stepTanHalfAngle{tanHalfAngle - (nConeSamplingSteps - 1) * angleStep};
190 simpleConeList.push_back(
SimpleCone(maxLayerApex, maxLayerDirection, stepConeLength, stepTanHalfAngle));
195 directionSum -= minLayerTrackState.GetMomentum();
196 trackStateList.pop_front();
const ThreeDSlidingFitResult m_slidingFitResult
The sliding fit result for the full cluster.
ThreeDSlidingConeFitResult(const T *const pT, const unsigned int slidingFitWindow, const float slidingFitLayerPitch)
Constructor.
const TwoDSlidingFitResult & GetSecondFitResult() const
Get the second sliding fit result for this cluster.
std::vector< SimpleCone > SimpleConeList
void GetSimpleConeList(const unsigned int nLayersForConeFit, const unsigned int nCones, const ConeSelection coneSelection, SimpleConeList &simpleConeList, const float tanHalfAngle=0.5f, const bool legacyMode=true) const
Get the list of simple cones fitted to the three dimensional cluster.
const ThreeDSlidingFitResult & GetSlidingFitResult() const
Get the sliding fit result for the full cluster.
std::list< pandora::TrackState > TrackStateLinkedList
The track state linked list typedef.
Header file for the lar three dimensional sliding cone fit result class.
std::map< int, LayerFitContribution > LayerFitContributionMap
std::map< int, pandora::TrackState > TrackStateMap
Header file for the cluster helper class.
pandora::StatusCode GetGlobalFitDirection(const float rL, pandora::CartesianVector &direction) const
Get global fit direction for a given longitudinal coordinate.
const pandora::CartesianVector & GetGlobalMaxLayerPosition() const
Get global position corresponding to the fit result in maximum fit layer.
const TrackStateMap & GetTrackStateMap() const
Get the track state map, which caches results from the sliding fit result.
ThreeDSlidingFitResult class.
const TwoDSlidingFitResult & GetFirstFitResult() const
Get the first sliding fit result for this cluster.
ConeSelection
ConeSelection enum.
pandora::StatusCode GetGlobalFitPosition(const float rL, pandora::CartesianVector &position) const
Get global fit position for a given longitudinal coordinate.
TwoDSlidingFitResult class.
TrackStateMap m_trackStateMap
The track state map.
const pandora::CartesianVector & GetGlobalMinLayerPosition() const
Get global position corresponding to the fit result in minimum fit layer.