LArSoft  v07_13_02
Liquid Argon Software toolkit - http://larsoft.org/
LArThreeDSlidingConeFitResult.cc
Go to the documentation of this file.
1 
9 #include "Objects/Cluster.h"
10 
12 
14 
15 #include <iterator>
16 
17 using namespace pandora;
18 
19 namespace lar_content
20 {
21 
22 float SimpleCone::GetMeanRT(const Cluster *const pCluster) const
23 {
24  CartesianPointVector hitPositionVector;
25  LArClusterHelper::GetCoordinateVector(pCluster, hitPositionVector);
26 
27  float rTSum(0.f);
28  const unsigned int nClusterHits(pCluster->GetNCaloHits());
29 
30  for (const CartesianVector &hitPosition : hitPositionVector)
31  {
32  const CartesianVector displacement(hitPosition - this->GetConeApex());
33  const float rT(displacement.GetCrossProduct(this->GetConeDirection()).GetMagnitude());
34  rTSum += rT;
35  }
36 
37  return ((nClusterHits > 0) ? rTSum / static_cast<float>(nClusterHits) : 0.f);
38 }
39 
40 //------------------------------------------------------------------------------------------------------------------------------------------
41 
42 float SimpleCone::GetBoundedHitFraction(const Cluster *const pCluster, const float coneLength, const float coneTanHalfAngle) const
43 {
44  CartesianPointVector hitPositionVector;
45  LArClusterHelper::GetCoordinateVector(pCluster, hitPositionVector);
46 
47  unsigned int nMatchedHits(0);
48  const unsigned int nClusterHits(pCluster->GetNCaloHits());
49 
50  for (const CartesianVector &hitPosition : hitPositionVector)
51  {
52  const CartesianVector displacement(hitPosition - this->GetConeApex());
53  const float rL(displacement.GetDotProduct(this->GetConeDirection()));
54 
55  if ((rL < 0.f) || (rL > coneLength))
56  continue;
57 
58  const float rT(displacement.GetCrossProduct(this->GetConeDirection()).GetMagnitude());
59 
60  if (rL * coneTanHalfAngle > rT)
61  ++nMatchedHits;
62  }
63 
64  return ((nClusterHits > 0) ? static_cast<float>(nMatchedHits) / static_cast<float>(nClusterHits) : 0.f);
65 }
66 
67 //------------------------------------------------------------------------------------------------------------------------------------------
68 //------------------------------------------------------------------------------------------------------------------------------------------
69 
70 template <typename T>
71 ThreeDSlidingConeFitResult::ThreeDSlidingConeFitResult(const T *const pT, const unsigned int slidingFitWindow,
72  const float slidingFitLayerPitch) :
73  m_slidingFitResult(ThreeDSlidingFitResult(pT, slidingFitWindow, slidingFitLayerPitch))
74 {
75  const CartesianVector &minLayerPosition3D(m_slidingFitResult.GetGlobalMinLayerPosition());
76  const CartesianVector &maxLayerPosition3D(m_slidingFitResult.GetGlobalMaxLayerPosition());
77 
80 
81  const LayerFitContributionMap &contributionMap1(fitResult1.GetLayerFitContributionMap());
82  const LayerFitContributionMap &contributionMap2(fitResult2.GetLayerFitContributionMap());
83 
84  const int nSteps(static_cast<int>((maxLayerPosition3D - minLayerPosition3D).GetMagnitude() / slidingFitLayerPitch));
85 
86  for (int iStep = 0; iStep <= nSteps; ++iStep)
87  {
88  try
89  {
90  const float rL((static_cast<float>(iStep) + 0.5f) * slidingFitLayerPitch);
91  CartesianVector fitPosition3D(0.f, 0.f, 0.f), fitDirection3D(0.f, 0.f, 0.f);
92 
93  if ((STATUS_CODE_SUCCESS != m_slidingFitResult.GetGlobalFitPosition(rL, fitPosition3D)) ||
94  (STATUS_CODE_SUCCESS != m_slidingFitResult.GetGlobalFitDirection(rL, fitDirection3D)))
95  {
96  continue;
97  }
98 
99  // ATTN Do not include layers without contributions in track state map (contain only interpolations)
100  if (!contributionMap1.count(fitResult1.GetLayer(rL)) && !contributionMap2.count(fitResult2.GetLayer(rL)))
101  continue;
102 
103  (void) m_trackStateMap.insert(TrackStateMap::value_type(iStep, TrackState(fitPosition3D, fitDirection3D)));
104  }
105  catch (const StatusCodeException &)
106  {
107  /* Deliberately empty */
108  }
109  }
110 }
111 
112 //------------------------------------------------------------------------------------------------------------------------------------------
113 
114 void ThreeDSlidingConeFitResult::GetSimpleConeList(const unsigned int nLayersForConeFit, const unsigned int nCones, const ConeSelection coneSelection,
115  SimpleConeList &simpleConeList) const
116 {
117  const TrackStateMap &trackStateMap(this->GetTrackStateMap());
118  const unsigned int nLayers(trackStateMap.size());
119 
120  if (nLayers + 1 < nLayersForConeFit + nCones)
121  throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
122 
123  // Calculate intervals and offsets such that cones are evenly spaced along sliding fit and are equidistant from the extremal layers
124  const unsigned int coneInterval((nCones > 1) ? (nLayers - nLayersForConeFit) / (nCones - 1) : 1);
125  const ThreeDSlidingFitResult &slidingFitResult(this->GetSlidingFitResult());
126  const CartesianVector coneDisplacement(slidingFitResult.GetGlobalMaxLayerPosition() - slidingFitResult.GetGlobalMinLayerPosition());
127  const bool isForward(coneDisplacement.GetZ() > std::numeric_limits<float>::epsilon());
128  const unsigned int coneOffset1((nLayers - nLayersForConeFit - (nCones - 1) * coneInterval) / 2);
129  const unsigned int coneOffset2((1 == nLayers % 2) && isForward ? 1 : 0);
130  const unsigned int coneOffset(coneOffset1 + coneOffset2);
131 
132  TrackStateLinkedList trackStateList;
133  CartesianVector directionSum(0.f, 0.f, 0.f);
134  const float clusterLength((trackStateMap.begin()->second.GetPosition() - trackStateMap.rbegin()->second.GetPosition()).GetMagnitude());
135 
136  unsigned int nConeSamplingSteps(0);
137 
138  for (TrackStateMap::const_iterator iter = trackStateMap.begin(), iterEnd = trackStateMap.end(); iter != iterEnd; ++iter)
139  {
140  if (nConeSamplingSteps >= nCones)
141  return;
142 
143  trackStateList.push_back(iter->second);
144  directionSum += iter->second.GetMomentum();
145 
146  const unsigned int beginDistance(static_cast<unsigned int>(std::distance(trackStateMap.begin(), iter)));
147 
148  if (beginDistance + 1 < nLayersForConeFit)
149  continue;
150 
151  const TrackState &maxLayerTrackState(trackStateList.back());
152  const TrackState &minLayerTrackState(trackStateList.front());
153 
154  if ((beginDistance + 1 >= nLayersForConeFit + coneOffset) && (beginDistance + 1 - nLayersForConeFit - coneOffset) % coneInterval == 0)
155  {
156  const CartesianVector &minLayerApex(minLayerTrackState.GetPosition());
157  const CartesianVector &maxLayerApex(maxLayerTrackState.GetPosition());
158 
159  const CartesianVector minLayerDirection(directionSum.GetUnitVector());
160  const CartesianVector maxLayerDirection(directionSum.GetUnitVector() * -1.f);
161 
162  // TODO Estimate cone length and angle here too, maybe by projecting positions onto direction and looking at rT distribution?
163  ++nConeSamplingSteps;
164  const float placeHolderTanHalfAngle(0.5f);
165 
166  if ((CONE_FORWARD_ONLY == coneSelection) || (CONE_BOTH_DIRECTIONS == coneSelection))
167  simpleConeList.push_back(SimpleCone(minLayerApex, minLayerDirection, clusterLength, placeHolderTanHalfAngle));
168 
169  if ((CONE_BACKWARD_ONLY == coneSelection) || (CONE_BOTH_DIRECTIONS == coneSelection))
170  simpleConeList.push_back(SimpleCone(maxLayerApex, maxLayerDirection, clusterLength, placeHolderTanHalfAngle));
171  }
172 
173  directionSum -= minLayerTrackState.GetMomentum();
174  trackStateList.pop_front();
175  }
176 }
177 
178 //------------------------------------------------------------------------------------------------------------------------------------------
179 //------------------------------------------------------------------------------------------------------------------------------------------
180 
181 template ThreeDSlidingConeFitResult::ThreeDSlidingConeFitResult(const pandora::Cluster *const, const unsigned int, const float);
182 template ThreeDSlidingConeFitResult::ThreeDSlidingConeFitResult(const pandora::CartesianPointVector *const, const unsigned int, const float);
183 
184 } // namespace lar_content
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
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.
void GetSimpleConeList(const unsigned int nLayersForConeFit, const unsigned int nCones, const ConeSelection coneSelection, SimpleConeList &simpleConeList) const
Get the list of simple cones fitted to the three dimensional cluster.
std::map< int, LayerFitContribution > LayerFitContributionMap
TFile f
Definition: plotHisto.C:6
intermediate_table::const_iterator const_iterator
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.
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.
TrackStateMap m_trackStateMap
The track state map.
const pandora::CartesianVector & GetGlobalMinLayerPosition() const
Get global position corresponding to the fit result in minimum fit layer.