Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
ClearLongitudinalTrackHitsTool.cc
Go to the documentation of this file.
1
10
12
14
15using namespace pandora;
16
17namespace lar_content
18{
19
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
Grouping of header files for many classes of use in particle flow algorithms.
Header file for the clear longitudinal track hit creation tool.
Header file for the geometry helper class.
void GetLongitudinalTrackHit3D(const MatchedSlidingFitMap &matchedSlidingFitMap, const pandora::CartesianVector &vtx3D, const pandora::CartesianVector &end3D, ProtoHit &protoHit) const
Get the three dimensional position using a provided two dimensional calo hit and sliding linear fits ...
virtual void GetBestPosition3D(const pandora::HitType hitType1, const pandora::HitType hitType2, const pandora::CartesianPointVector &fitPositionList1, const pandora::CartesianPointVector &fitPositionList2, ProtoHit &protoHit) const
Get the three dimensional position using a provided two dimensional calo hit and candidate fit positi...
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
Proto hits are temporary constructs to be used during iterative 3D hit procedure.
const pandora::CaloHit * GetParentCaloHit2D() const
Get the address of the parent 2D calo hit.
unsigned int m_minViews
The minimum number of views required for building hits.
std::map< pandora::HitType, TwoDSlidingFitResult > MatchedSlidingFitMap
void GetLocalPosition(const pandora::CartesianVector &position, float &rL, float &rT) const
Get local sliding fit coordinates for a given global position.
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.
const FitSegment & GetFitSegment(const float rL) const
Get fit segment for a given longitudinal coordinate.
CaloHit class.
Definition CaloHit.h:26
HitType GetHitType() const
Get the calorimeter hit type.
Definition CaloHit.h:441
const CartesianVector & GetPositionVector() const
Get the position vector of center of calorimeter cell, units mm.
Definition CaloHit.h:350
CartesianVector class.
float GetX() const
Get the cartesian x coordinate.
const Pandora & GetPandora() const
Get the associated pandora instance.
Definition Process.h:116
StatusCodeException class.
HitType
Calorimeter hit type enum.
std::vector< CartesianVector > CartesianPointVector
StatusCode
The StatusCode enum.