ClearLongitudinalTrackHitsTool.cc
Go to the documentation of this file.
1 /**
2  * @file larpandoracontent/LArThreeDReco/LArHitCreation/ClearLongitudinalTrackHitsTool.cc
3  *
4  * @brief Implementation of the clear longitudinal track hit creation tool.
5  *
6  * $Log: $
7  */
8 
9 #include "Pandora/AlgorithmHeaders.h"
10 
12 
14 
15 using namespace pandora;
16 
17 namespace lar_content
18 {
19 
20 void ClearLongitudinalTrackHitsTool::GetLongitudinalTrackHit3D(
21  const MatchedSlidingFitMap &matchedSlidingFitMap, const CartesianVector &vtx3D, const CartesianVector &end3D, ProtoHit &protoHit) const
22 {
23  const CaloHit *const pCaloHit2D(protoHit.GetParentCaloHit2D());
24  const HitType hitType(pCaloHit2D->GetHitType());
25  const HitType hitType1((TPC_VIEW_U == hitType) ? TPC_VIEW_V : (TPC_VIEW_V == hitType) ? TPC_VIEW_W : TPC_VIEW_U);
26  const HitType hitType2((TPC_VIEW_U == hitType) ? TPC_VIEW_W : (TPC_VIEW_V == hitType) ? TPC_VIEW_U : TPC_VIEW_V);
27 
28  const CartesianVector vtx2D(LArGeometryHelper::ProjectPosition(this->GetPandora(), vtx3D, hitType));
29  const CartesianVector end2D(LArGeometryHelper::ProjectPosition(this->GetPandora(), end3D, hitType));
30 
31  if ((end2D - vtx2D).GetMagnitudeSquared() < std::numeric_limits<float>::epsilon())
32  throw StatusCodeException(STATUS_CODE_NOT_FOUND);
33 
34  const float frac((end2D - vtx2D).GetDotProduct(pCaloHit2D->GetPositionVector() - vtx2D) / (end2D - vtx2D).GetMagnitudeSquared());
35  const CartesianVector projection3D(vtx3D + (end3D - vtx3D) * frac);
36 
37  CartesianPointVector fitPositionList1, fitPositionList2;
38 
39  MatchedSlidingFitMap::const_iterator fIter1 = matchedSlidingFitMap.find(hitType1);
40  if (matchedSlidingFitMap.end() != fIter1)
41  {
42  const TwoDSlidingFitResult &fitResult1 = fIter1->second;
43  const CartesianVector position2D(LArGeometryHelper::ProjectPosition(this->GetPandora(), projection3D, hitType1));
44 
45  float rL1(0.f), rT1(0.f);
46  CartesianVector position1(0.f, 0.f, 0.f);
47  fitResult1.GetLocalPosition(position2D, rL1, rT1);
48  const StatusCode statusCode(fitResult1.GetTransverseProjection(pCaloHit2D->GetPositionVector().GetX(), fitResult1.GetFitSegment(rL1), position1));
49 
50  if ((STATUS_CODE_SUCCESS != statusCode) && (STATUS_CODE_NOT_FOUND != statusCode))
51  throw StatusCodeException(statusCode);
52 
53  if (STATUS_CODE_SUCCESS == statusCode)
54  fitPositionList1.push_back(position1);
55  }
56 
57  MatchedSlidingFitMap::const_iterator fIter2 = matchedSlidingFitMap.find(hitType2);
58  if (matchedSlidingFitMap.end() != fIter2)
59  {
60  const TwoDSlidingFitResult &fitResult2 = fIter2->second;
61  const CartesianVector position2D(LArGeometryHelper::ProjectPosition(this->GetPandora(), projection3D, hitType2));
62 
63  float rL2(0.f), rT2(0.f);
64  CartesianVector position2(0.f, 0.f, 0.f);
65  fitResult2.GetLocalPosition(position2D, rL2, rT2);
66  const StatusCode statusCode(fitResult2.GetTransverseProjection(pCaloHit2D->GetPositionVector().GetX(), fitResult2.GetFitSegment(rL2), position2));
67 
68  if ((STATUS_CODE_SUCCESS != statusCode) && (STATUS_CODE_NOT_FOUND != statusCode))
69  throw StatusCodeException(statusCode);
70 
71  if (STATUS_CODE_SUCCESS == statusCode)
72  fitPositionList2.push_back(position2);
73  }
74 
75  unsigned int nViews(1);
76  if (fitPositionList1.size() > 0)
77  ++nViews;
78  if (fitPositionList2.size() > 0)
79  ++nViews;
80 
81  if (nViews < m_minViews)
82  throw StatusCodeException(STATUS_CODE_NOT_FOUND);
83 
84  this->GetBestPosition3D(hitType1, hitType2, fitPositionList1, fitPositionList2, protoHit);
85 }
86 
87 } // namespace lar_content
Proto hits are temporary constructs to be used during iterative 3D hit procedure. ...
std::map< pandora::HitType, TwoDSlidingFitResult > MatchedSlidingFitMap
enum cvn::HType HitType
const pandora::CaloHit * GetParentCaloHit2D() const
Get the address of the parent 2D calo hit.
intermediate_table::const_iterator const_iterator
Header file for the geometry helper class.
const FitSegment & GetFitSegment(const float rL) const
Get fit segment for a given longitudinal coordinate.
Header file for the clear longitudinal track hit creation tool.
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.
void GetLocalPosition(const pandora::CartesianVector &position, float &rL, float &rT) const
Get local sliding fit coordinates for a given global position.