9 #include "Pandora/AlgorithmHeaders.h" 20 SimplePCAThreeDClusteringTool::SimplePCAThreeDClusteringTool()
26 bool SimplePCAThreeDClusteringTool::Run(
const CaloHitList &inputCaloHitList, std::vector<CaloHitList> &outputCaloHitListsVector)
29 CartesianVector centroid(0.
f, 0.
f, 0.
f);
32 LArPcaHelper::RunPca(inputCaloHitList, centroid, eigenValues, eigenVecs);
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);
63 LArPcaHelper::RunPca(posCaloHitList, centroidPos, eigenValuesPos, eigenVecsPos);
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);
72 LArPcaHelper::RunPca(negCaloHitList, centroidNeg, eigenValuesNeg, eigenVecsNeg);
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);
111 StatusCode SimplePCAThreeDClusteringTool::ReadSettings(
const TiXmlHandle )
113 return STATUS_CODE_SUCCESS;
pandora::CartesianVector EigenValues
Header file for the principal curve analysis helper class.
std::pair< float, float > GetIntersection(double Ax, double Ay, double Bx, double By, double Cx, double Cy, double Dx, double Dy)
std::vector< pandora::CartesianVector > EigenVectors