LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
LArTwoDSlidingFitResult.h
Go to the documentation of this file.
1 
8 #ifndef LAR_TWO_D_SLIDING_FIT_RESULT_H
9 #define LAR_TWO_D_SLIDING_FIT_RESULT_H 1
10 
11 #include "Api/PandoraApi.h"
12 
14 
15 #include <unordered_map>
16 
17 namespace lar_content
18 {
19 
24 {
25 public:
35  template <typename T>
36  TwoDSlidingFitResult(const T *const pT, const unsigned int layerFitHalfWindow, const float layerPitch,
37  const float axisDeviationLimitForHitDivision = 0.95f);
38 
51  template <typename T>
52  TwoDSlidingFitResult(const T *const pT, const unsigned int layerFitHalfWindow, const float layerPitch,
53  const pandora::CartesianVector &axisIntercept, const pandora::CartesianVector &axisDirection,
54  const pandora::CartesianVector &orthoDirection, const float axisDeviationLimitForHitDivision = 0.95f);
55 
68  TwoDSlidingFitResult(const unsigned int layerFitHalfWindow, const float layerPitch, const pandora::CartesianVector &axisIntercept,
69  const pandora::CartesianVector &axisDirection, const pandora::CartesianVector &orthoDirection,
70  const LayerFitContributionMap &layerFitContributionMap);
71 
79  const pandora::Cluster *GetCluster() const;
80 
86  unsigned int GetLayerFitHalfWindow() const;
87 
93  float GetLayerPitch() const;
94 
100  const pandora::CartesianVector &GetAxisIntercept() const;
101 
107  const pandora::CartesianVector &GetAxisDirection() const;
108 
114  const pandora::CartesianVector &GetOrthoDirection() const;
115 
122 
129 
135  const FitSegmentList &GetFitSegmentList() const;
136 
142  float GetLayerFitHalfWindowLength() const;
143 
149  int GetMinLayer() const;
150 
156  int GetMaxLayer() const;
157 
164  void GetMinAndMaxX(float &minX, float &maxX) const;
165 
172  void GetMinAndMaxZ(float &minZ, float &maxZ) const;
173 
179  int GetLayer(const float rL) const;
180 
186  float GetL(const int layer) const;
187 
195  void GetLocalPosition(const pandora::CartesianVector &position, float &rL, float &rT) const;
196 
203  void GetLocalDirection(const pandora::CartesianVector &direction, float &dTdL) const;
204 
212  void GetGlobalPosition(const float rL, const float rT, pandora::CartesianVector &position) const;
213 
220  void GetGlobalDirection(const float dTdL, pandora::CartesianVector &direction) const;
221 
227  pandora::CartesianVector GetGlobalMinLayerPosition() const;
228 
234  pandora::CartesianVector GetGlobalMaxLayerPosition() const;
235 
241  pandora::CartesianVector GetGlobalMinLayerDirection() const;
242 
248  pandora::CartesianVector GetGlobalMaxLayerDirection() const;
249 
255  float GetMinLayerRms() const;
256 
262  float GetMaxLayerRms() const;
263 
271  float GetFitRms(const float rL) const;
272 
278  float GetCosScatteringAngle(const float rL) const;
279 
288  pandora::StatusCode GetGlobalFitPosition(const float rL, pandora::CartesianVector &position) const;
289 
298  pandora::StatusCode GetGlobalFitDirection(const float rL, pandora::CartesianVector &direction) const;
299 
308  pandora::StatusCode GetGlobalFitPositionAtX(const float x, pandora::CartesianVector &position) const;
309 
318  pandora::StatusCode GetGlobalFitDirectionAtX(const float x, pandora::CartesianVector &direction) const;
319 
328  pandora::StatusCode GetGlobalFitProjection(const pandora::CartesianVector &inputPosition, pandora::CartesianVector &projectedPosition) const;
329 
338  pandora::StatusCode GetGlobalFitPositionListAtX(const float x, pandora::CartesianPointVector &positionList) const;
339 
349  pandora::StatusCode GetTransverseProjection(const float x, const FitSegment &fitSegment, pandora::CartesianVector &position) const;
350 
361  pandora::StatusCode GetTransverseProjection(
362  const float x, const FitSegment &fitSegment, pandora::CartesianVector &position, pandora::CartesianVector &direction) const;
363 
372  pandora::StatusCode GetExtrapolatedPosition(const float rL, pandora::CartesianVector &position) const;
373 
382  pandora::StatusCode GetExtrapolatedDirection(const float rL, pandora::CartesianVector &direction) const;
383 
392  pandora::StatusCode GetExtrapolatedPositionAtX(const float x, pandora::CartesianVector &position) const;
393 
399  const FitSegment &GetFitSegment(const float rL) const;
400 
401 private:
405  void CalculateAxes(const pandora::CartesianPointVector &coordinateVector, const float layerPitch);
406 
410  void FillLayerFitContributionMap(const pandora::CartesianPointVector &coordinateVector);
411 
416 
420  void FindSlidingFitSegments();
421 
429  void GetMinAndMaxCoordinate(const bool isX, float &min, float &max) const;
430 
438  pandora::CartesianVector GetGlobalFitPosition(const LayerInterpolation &layerInterpolation) const;
439 
447  pandora::CartesianVector GetGlobalFitDirection(const LayerInterpolation &layerInterpolation) const;
448 
456  float GetFitRms(const LayerInterpolation &layerInterpolation) const;
457 
466  pandora::StatusCode LongitudinalInterpolation(const float rL, LayerInterpolation &layerInterpolation) const;
467 
477  pandora::StatusCode TransverseInterpolation(const float x, const FitSegment &fitSegment, LayerInterpolation &layerInterpolation) const;
478 
487  pandora::StatusCode TransverseInterpolation(const float x, LayerInterpolationList &layerInterpolationList) const;
488 
498  pandora::StatusCode GetLongitudinalSurroundingLayers(
499  const float rL, LayerFitResultMap::const_iterator &firstLayerIter, LayerFitResultMap::const_iterator &secondLayerIter) const;
500 
512  pandora::StatusCode GetTransverseSurroundingLayers(const float x, const int minLayer, const int maxLayer,
513  LayerFitResultMap::const_iterator &firstLayerIter, LayerFitResultMap::const_iterator &secondLayerIter) const;
514 
524  void GetLongitudinalInterpolationWeights(const float rL, const LayerFitResultMap::const_iterator &firstLayerIter,
525  const LayerFitResultMap::const_iterator &secondLayerIter, double &firstWeight, double &secondWeight) const;
526 
536  void GetTransverseInterpolationWeights(const float x, const LayerFitResultMap::const_iterator &firstLayerIter,
537  const LayerFitResultMap::const_iterator &secondLayerIter, double &firstWeight, double &secondWeight) const;
538 
539  const pandora::Cluster *m_pCluster;
540  unsigned int m_layerFitHalfWindow;
541  float m_layerPitch;
542  pandora::CartesianVector m_axisIntercept;
543  pandora::CartesianVector m_axisDirection;
544  pandora::CartesianVector m_orthoDirection;
548 };
549 
550 typedef std::vector<TwoDSlidingFitResult> TwoDSlidingFitResultList;
551 typedef std::unordered_map<const pandora::Cluster *, TwoDSlidingFitResult> TwoDSlidingFitResultMap;
552 
553 //------------------------------------------------------------------------------------------------------------------------------------------
554 //------------------------------------------------------------------------------------------------------------------------------------------
555 
557 {
558  return m_layerFitHalfWindow;
559 }
560 
561 //------------------------------------------------------------------------------------------------------------------------------------------
562 
564 {
565  return m_layerPitch;
566 }
567 
568 //------------------------------------------------------------------------------------------------------------------------------------------
569 
570 inline const pandora::CartesianVector &TwoDSlidingFitResult::GetAxisIntercept() const
571 {
572  return m_axisIntercept;
573 }
574 
575 //------------------------------------------------------------------------------------------------------------------------------------------
576 
577 inline const pandora::CartesianVector &TwoDSlidingFitResult::GetAxisDirection() const
578 {
579  return m_axisDirection;
580 }
581 
582 //------------------------------------------------------------------------------------------------------------------------------------------
583 
584 inline const pandora::CartesianVector &TwoDSlidingFitResult::GetOrthoDirection() const
585 {
586  return m_orthoDirection;
587 }
588 
589 //------------------------------------------------------------------------------------------------------------------------------------------
590 
592 {
593  return m_layerFitResultMap;
594 }
595 
596 //------------------------------------------------------------------------------------------------------------------------------------------
597 
599 {
601 }
602 
603 //------------------------------------------------------------------------------------------------------------------------------------------
604 
606 {
607  return m_fitSegmentList;
608 }
609 
610 //------------------------------------------------------------------------------------------------------------------------------------------
611 
612 inline void TwoDSlidingFitResult::GetMinAndMaxX(float &minX, float &maxX) const
613 {
614  return this->GetMinAndMaxCoordinate(true, minX, maxX);
615 }
616 
617 //------------------------------------------------------------------------------------------------------------------------------------------
618 
619 inline void TwoDSlidingFitResult::GetMinAndMaxZ(float &minZ, float &maxZ) const
620 {
621  return this->GetMinAndMaxCoordinate(false, minZ, maxZ);
622 }
623 
624 } // namespace lar_content
625 
626 #endif // #ifndef LAR_TWO_D_SLIDING_FIT_RESULT_H
Float_t x
Definition: compare.C:6
void FillLayerFitContributionMap(const pandora::CartesianPointVector &coordinateVector)
Fill the layer fit contribution map.
unsigned int GetLayerFitHalfWindow() const
Get the layer fit half window.
void GetMinAndMaxCoordinate(const bool isX, float &min, float &max) const
Get the minimum and maximum x or z coordinates associated with the sliding fit.
TwoDSlidingFitResult(const T *const pT, const unsigned int layerFitHalfWindow, const float layerPitch, const float axisDeviationLimitForHitDivision=0.95f)
Constructor using internal definition of primary axis.
pandora::CartesianVector m_axisIntercept
The axis intercept position.
void GetTransverseInterpolationWeights(const float x, const LayerFitResultMap::const_iterator &firstLayerIter, const LayerFitResultMap::const_iterator &secondLayerIter, double &firstWeight, double &secondWeight) const
Get interpolation weights for layers surrounding a specified transverse position. ...
pandora::StatusCode GetTransverseSurroundingLayers(const float x, const int minLayer, const int maxLayer, LayerFitResultMap::const_iterator &firstLayerIter, LayerFitResultMap::const_iterator &secondLayerIter) const
Get iterators for layers surrounding a specified transverse position.
const pandora::Cluster * m_pCluster
The address of the cluster.
void GetMinAndMaxX(float &minX, float &maxX) const
Get the minimum and maximum x coordinates associated with the sliding fit.
void FindSlidingFitSegments()
Find sliding fit segments; sections with tramsverse direction.
pandora::StatusCode GetExtrapolatedPositionAtX(const float x, pandora::CartesianVector &position) const
Get extrapolated position (beyond span) for a given input x coordinate.
void GetLocalDirection(const pandora::CartesianVector &direction, float &dTdL) const
Get local sliding fit gradient for a given global direction.
float GetMaxLayerRms() const
Get rms at maximum layer.
pandora::CartesianVector m_axisDirection
The axis direction vector.
void GetLongitudinalInterpolationWeights(const float rL, const LayerFitResultMap::const_iterator &firstLayerIter, const LayerFitResultMap::const_iterator &secondLayerIter, double &firstWeight, double &secondWeight) const
Get interpolation weights for layers surrounding a specified longitudinal position.
std::vector< FitSegment > FitSegmentList
float GetLayerFitHalfWindowLength() const
Get the layer fit half window length.
intermediate_table::const_iterator const_iterator
pandora::StatusCode LongitudinalInterpolation(const float rL, LayerInterpolation &layerInterpolation) const
Get the pair of layers surrounding a specified longitudinal position.
const pandora::CartesianVector & GetAxisDirection() const
Get the axis direction vector.
pandora::CartesianVector GetGlobalMinLayerDirection() const
Get global direction corresponding to the fit result in minimum fit layer.
pandora::StatusCode GetLongitudinalSurroundingLayers(const float rL, LayerFitResultMap::const_iterator &firstLayerIter, LayerFitResultMap::const_iterator &secondLayerIter) const
Get iterators for layers surrounding the specified longitudinal position.
std::map< int, LayerFitContribution > LayerFitContributionMap
const pandora::CartesianVector & GetAxisIntercept() const
Get the axis intercept position.
float GetCosScatteringAngle(const float rL) const
Get scattering angle for a given longitudinal coordinate.
TFile f
Definition: plotHisto.C:6
void GetMinAndMaxZ(float &minZ, float &maxZ) const
Get the minimum and maximum z coordinates associated with the sliding fit.
unsigned int m_layerFitHalfWindow
The layer fit half window.
int GetMaxLayer() const
Get the maximum occupied layer in the sliding fit.
int GetMinLayer() const
Get the minimum occupied layer in the sliding fit.
float GetFitRms(const float rL) const
Get fit rms for a given longitudinal coordinate.
pandora::StatusCode GetGlobalFitPosition(const float rL, pandora::CartesianVector &position) const
Get global fit position for a given longitudinal coordinate.
pandora::StatusCode TransverseInterpolation(const float x, const FitSegment &fitSegment, LayerInterpolation &layerInterpolation) const
Get the surrounding pair of layers for a specified transverse position and fit segment.
pandora::StatusCode GetExtrapolatedPosition(const float rL, pandora::CartesianVector &position) const
Get extrapolated position (beyond span) for a given input coordinate.
const pandora::CartesianVector & GetOrthoDirection() const
Get the orthogonal direction vector.
std::map< int, LayerFitResult > LayerFitResultMap
std::vector< TwoDSlidingFitResult > TwoDSlidingFitResultList
float GetLayerPitch() const
Get the layer pitch, units cm.
void CalculateAxes(const pandora::CartesianPointVector &coordinateVector, const float layerPitch)
Calculate the longitudinal and transverse axes.
const FitSegment & GetFitSegment(const float rL) const
Get fit segment for a given longitudinal coordinate.
pandora::CartesianVector GetGlobalMinLayerPosition() const
Get global position corresponding to the fit result in minimum fit layer.
const FitSegmentList & GetFitSegmentList() const
Get the fit segment list.
pandora::StatusCode GetExtrapolatedDirection(const float rL, pandora::CartesianVector &direction) const
Get extrapolated direction (beyond span) for a given input coordinate.
std::vector< LayerInterpolation > LayerInterpolationList
void GetGlobalDirection(const float dTdL, pandora::CartesianVector &direction) const
Get global direction coordinates for given sliding linear fit gradient.
const LayerFitResultMap & GetLayerFitResultMap() const
Get the layer fit result map.
float GetMinLayerRms() const
Get rms at minimum layer.
std::unordered_map< const pandora::Cluster *, TwoDSlidingFitResult > TwoDSlidingFitResultMap
const pandora::Cluster * GetCluster() const
Get the address of the cluster, if originally provided.
pandora::StatusCode GetGlobalFitPositionAtX(const float x, pandora::CartesianVector &position) const
Get global fit position for a given input x coordinate.
pandora::StatusCode GetGlobalFitDirection(const float rL, pandora::CartesianVector &direction) const
Get global fit direction for a given longitudinal coordinate.
pandora::StatusCode GetGlobalFitProjection(const pandora::CartesianVector &inputPosition, pandora::CartesianVector &projectedPosition) const
Get projected position on global fit for a given position vector.
void PerformSlidingLinearFit()
Perform the sliding linear fit.
void GetGlobalPosition(const float rL, const float rT, pandora::CartesianVector &position) const
Get global coordinates for given sliding linear fit coordinates.
FitSegmentList m_fitSegmentList
The fit segment list.
pandora::CartesianVector GetGlobalMaxLayerDirection() const
Get global direction corresponding to the fit result in maximum fit layer.
float GetL(const int layer) const
Get longitudinal coordinate for a given sliding linear fit layer number.
LayerFitContributionMap m_layerFitContributionMap
The layer fit contribution map.
pandora::StatusCode GetGlobalFitDirectionAtX(const float x, pandora::CartesianVector &direction) const
Get global fit direction for a given input x coordinate.
pandora::StatusCode GetTransverseProjection(const float x, const FitSegment &fitSegment, pandora::CartesianVector &position) const
Get projected position for a given input x coordinate and fit segment.
Header file for the lar two dimensional sliding fit objects.
float m_layerPitch
The layer pitch, units cm.
pandora::StatusCode GetGlobalFitPositionListAtX(const float x, pandora::CartesianPointVector &positionList) const
Get a list of projected positions for a given input x coordinate.
const LayerFitContributionMap & GetLayerFitContributionMap() const
Get the layer fit contribution map.
LayerFitResultMap m_layerFitResultMap
The layer fit result map.
void GetLocalPosition(const pandora::CartesianVector &position, float &rL, float &rT) const
Get local sliding fit coordinates for a given global position.
pandora::CartesianVector m_orthoDirection
The orthogonal direction vector.
pandora::CartesianVector GetGlobalMaxLayerPosition() const
Get global position corresponding to the fit result in maximum fit layer.
int GetLayer(const float rL) const
Get layer number for given sliding linear fit longitudinal coordinate.