29 CartesianVector centroid(0.
f, 0.
f, 0.
f);
35 const CartesianVector orthoDirection1(eigenVecs.at(1).GetZ() > 0.f ? eigenVecs.at(1) : eigenVecs.at(1) * -1.f);
38 CaloHitList posCaloHitList, negCaloHitList;
40 for (
const CaloHit *
const pCaloHit3D : inputCaloHitList)
42 const CartesianVector pCaloHit3DPosition{pCaloHit3D->GetPositionVector()};
44 if ((pCaloHit3DPosition - centroid).GetDotProduct(orthoDirection1) < 0)
46 negCaloHitList.push_back(pCaloHit3D);
50 posCaloHitList.push_back(pCaloHit3D);
54 outputCaloHitListsVector.push_back(posCaloHitList);
55 outputCaloHitListsVector.push_back(negCaloHitList);
60 CartesianVector centroidPos(0.
f, 0.
f, 0.
f);
66 const CartesianVector axisDirectionPos(eigenVecsPos.at(0).GetZ() > 0.f ? eigenVecsPos.at(0) : eigenVecsPos.at(0) * -1.f);
69 CartesianVector centroidNeg(0.
f, 0.
f, 0.
f);
75 const CartesianVector axisDirectionNeg(eigenVecsNeg.at(0).GetZ() > 0.f ? eigenVecsNeg.at(0) : eigenVecsNeg.at(0) * -1.f);
78 CartesianVector intersectionPoint(0.
f, 0.
f, 0.
f);
79 float displacementPos(0.
f), displacementNeg(0.
f);
84 centroidPos, axisDirectionPos, centroidNeg, axisDirectionNeg, intersectionPoint, displacementPos, displacementNeg);
86 catch (
const StatusCodeException &)
88 std::cout <<
"Exception caught! Cannot get intersection between positive and negative hit lists primary PCA axes!" << std::endl;
92 posCaloHitList.clear();
93 negCaloHitList.clear();
96 for (
const CaloHit *
const pCaloHit3D : inputCaloHitList)
98 const float cosConeAxisPos = axisDirectionPos.GetCosOpeningAngle(pCaloHit3D->GetPositionVector() - intersectionPoint);
99 const float cosConeAxisNeg = axisDirectionNeg.GetCosOpeningAngle(pCaloHit3D->GetPositionVector() - intersectionPoint);
100 if (cosConeAxisPos > cosConeAxisNeg)
101 posCaloHitList.push_back(pCaloHit3D);
103 negCaloHitList.push_back(pCaloHit3D);
static void GetIntersection(const LArPointingCluster::Vertex &firstVertex, const LArPointingCluster::Vertex &secondVertex, pandora::CartesianVector &intersectPosition, float &firstDisplacement, float &secondDisplacement)
Get intersection of two vertices.
pandora::CartesianVector EigenValues
static void RunPca(const T &t, pandora::CartesianVector ¢roid, EigenValues &outputEigenValues, EigenVectors &outputEigenVectors)
Run principal component analysis using input calo hits (TPC_VIEW_U,V,W or TPC_3D; all treated as 3D p...
std::vector< pandora::CartesianVector > EigenVectors