327     bool consistent(
false);
 
  342     Eigen::Vector3f firstPosToNextPosVec  = nextCenter - firstCenter;
 
  343     Eigen::Vector3f firstPosToNextPosUnit = firstPosToNextPosVec.normalized();
 
  344     float           firstPosToNextPosLen  = firstPosToNextPosVec.norm();
 
  352     float arcLenToNextDoca = firstPosToNextPosVec.dot(firstAxis2);
 
  356     if (arcLenToNextDoca < 0.)
 
  358         firstAxis0       = -firstAxis0;
 
  359         firstAxis1       = -firstAxis1;
 
  360         firstAxis2       = -firstAxis2;
 
  361         arcLenToNextDoca = -arcLenToNextDoca;
 
  371     Eigen::Vector2f firstProj01Unit = Eigen::Vector2f(firstPosToNextPosUnit.dot(firstAxis0),firstPosToNextPosUnit.dot(firstAxis1)).normalized();
 
  372     float           firstEigen0Proj = firstEigenVals[0] * firstProj01Unit[0];
 
  373     float           firstEigen1Proj = firstEigenVals[1] * firstProj01Unit[1];
 
  374     float           rMaxFirst       = std::sqrt(firstEigen0Proj * firstEigen0Proj + firstEigen1Proj * firstEigen1Proj);
 
  375     float           cosMaxFirst     = firstEigenVals[2] / std::sqrt(firstEigenVals[2] * firstEigenVals[2] + rMaxFirst * rMaxFirst);
 
  376     float           cosFirstAxis    = firstAxis2.dot(firstPosToNextPosUnit);
 
  379     float firstEigenVal2       = firstEigenVals[2];
 
  380     float firstToNextProjEigen = firstEigenVal2;
 
  383     if (cosFirstAxis < cosMaxFirst)
 
  386         float sinFirstAxis = std::sqrt(1. - cosFirstAxis * cosFirstAxis);
 
  389         firstToNextProjEigen = rMaxFirst / sinFirstAxis;
 
  391     else firstToNextProjEigen /= cosFirstAxis;
 
  394     float firstPosToNextPosScaleFactor = 8.;
 
  407     if (firstPosToNextPosLen < firstPosToNextPosScaleFactor * firstToNextProjEigen)
 
  415         float cosFirstNextAxis = firstAxis2.dot(nextAxis2);
 
  419         if (cosFirstNextAxis < 0.)
 
  421             nextAxis0         = -nextAxis0;
 
  422             nextAxis1         = -nextAxis1;
 
  423             nextAxis2         = -nextAxis2;
 
  424             cosFirstNextAxis  = -cosFirstNextAxis;
 
  433         Eigen::Vector2f nextProj01Unit = Eigen::Vector2f(firstPosToNextPosUnit.dot(nextAxis0),firstPosToNextPosUnit.dot(nextAxis1)).normalized();
 
  434         float           nextEigen0Proj = nextEigenVals[0] * nextProj01Unit[0];
 
  435         float           nextEigen1Proj = nextEigenVals[1] * nextProj01Unit[1];
 
  436         float           rMaxNext       = std::sqrt(nextEigen0Proj * nextEigen0Proj + nextEigen1Proj * nextEigen1Proj);
 
  437         float           cosMaxNext     = nextEigenVals[2] / std::sqrt(nextEigenVals[2] * nextEigenVals[2] + rMaxNext * rMaxNext);
 
  438         float           cosNextAxis    = 
std::abs(nextAxis2.dot(firstPosToNextPosUnit));
 
  441         float nextToFirstProjEigen = nextEigenVals[2];
 
  444         if (cosNextAxis < cosMaxNext)
 
  447             float sinNextAxis = std::sqrt(1. - cosNextAxis * cosNextAxis);
 
  450             nextToFirstProjEigen = rMaxNext / sinNextAxis;
 
  452         else nextToFirstProjEigen /= cosNextAxis;
 
  456         float nextToFirstScaleFactor = 8. * cosFirstNextAxis;
 
  460         float gapFirstToNext = firstPosToNextPosLen - firstToNextProjEigen - nextToFirstProjEigen;
 
  463         Eigen::Vector3f firstEndPoint = firstCenter + firstEigenVals[2] * firstAxis2;
 
  464         Eigen::Vector3f nextTailPoint = nextCenter  - nextEigenVals[2]  * nextAxis2;
 
  465         Eigen::Vector3f endToTailVec  = nextTailPoint - firstEndPoint;
 
  468         float endPointProjection = endToTailVec.dot(firstPosToNextPosUnit);
 
  469         float endToTailLen       = endToTailVec.norm();
 
  487         if (gapFirstToNext < nextToFirstScaleFactor * nextToFirstProjEigen || (
std::abs(endPointProjection) < nextToFirstProjEigen && endToTailLen < nextEigenVals[2]))
 
  491             Eigen::Vector3f firstPoca;
 
  492             Eigen::Vector3f nextPoca;
 
  493             Eigen::Vector3f firstToNextUnit;
 
  496             float lineDoca = 
closestApproach(firstCenter, firstAxis2, nextCenter, nextAxis2, firstPoca, nextPoca, firstToNextUnit);
 
  499             Eigen::Vector3f firstPOCAProjUnit     = Eigen::Vector3f(firstToNextUnit.dot(firstAxis0),firstToNextUnit.dot(firstAxis1),firstToNextUnit.dot(firstAxis1)).normalized();
 
  500             float           firstPOCAVecProjEigen = std::sqrt(std::pow(firstEigenVals[0] * firstPOCAProjUnit[0],2)
 
  501                                                   +           std::pow(firstEigenVals[1] * firstPOCAProjUnit[1],2)
 
  502                                                   +           std::pow(firstEigenVals[2] * firstPOCAProjUnit[2],2));
 
  505             Eigen::Vector3f nextPOCAProjUnit     = Eigen::Vector3f(firstToNextUnit.dot(firstAxis0),firstToNextUnit.dot(firstAxis1),firstToNextUnit.dot(firstAxis1)).normalized();
 
  506             float           nextPOCAVecProjEigen = std::sqrt(std::pow(nextEigenVals[0] * nextPOCAProjUnit[0],2)
 
  507                                                  +           std::pow(nextEigenVals[1] * nextPOCAProjUnit[1],2)
 
  508                                                  +           std::pow(nextEigenVals[2] * nextPOCAProjUnit[2],2));
 
  513                 float arcLenToFirstPoca = (firstPoca - firstCenter).
dot(firstAxis2);
 
  514                 float arcLenToNextPoca  = (nextPoca  - nextCenter ).
dot(nextAxis2);
 
  522             float rMaxScaleFactor = 1.2;
 
  524             if (lineDoca < rMaxScaleFactor * (firstPOCAVecProjEigen + nextPOCAVecProjEigen))
 
std::vector< TH1F * > fNextEigenValueHists
Next Cluster eigen value. 
constexpr auto dot(Vector const &a, Vector const &b)
Return cross product of two vectors. 
float closestApproach(const Eigen::Vector3f &, const Eigen::Vector3f &, const Eigen::Vector3f &, const Eigen::Vector3f &, Eigen::Vector3f &, Eigen::Vector3f &, Eigen::Vector3f &) const 
TH1F * fCosMaxFirstHist
Cos angle beteeen cylinder axis and edge. 
TH1F * f2ndDocaArcLRatHist
arc length to POCA for DOCA second cluster 
bool fOutputHistograms
Take the time to create and fill some histograms for diagnostics. 
TH1F * fRMaxFirstHist
radius of "cylinder" first cluster 
TH1F * fCosFirstAxisHist
Cos angle between vector between centers and first axis. 
TH1F * fProjEndPointRatHist
Ratio of projection to vector length. 
const EigenValues & getEigenValues() const 
reco::PrincipalComponents & getFullPCA()
TH1F * fCosNextAxisHist
Cos angle between vector between centers and next axis. 
TH1F * f2ndTo1stProjEigenHist
arc length along vector between centers from next center to cylinder 
TH1F * f1stTo2ndPosLenRatHist
Ratio of distance between centers and first proj eigen. 
const Eigen::Vector3f & getAvePosition() const 
TH1F * fRMaxNextHist
radius of "cylinder" next cluster 
TH1F * f1stTo2ndProjEigenHist
arc length along vector between centers from first center to cylinder 
TH1F * fProjEndPointLenHist
Projection of vector between the endpoints. 
float fMinTransEigenVal
Set a mininum allowed value for the transverse eigen values. 
TH1F * fAxesDocaHist
Closest distance between two primary axes. 
TH1F * fCosMaxNextHist
Cos angle beteeen cylinder axis and edge. 
TH1F * fGapBetweenClusHist
Gap between clusters. 
TH1F * f1stDocaArcLRatHist
arc length to POCA for DOCA first cluster 
TH1F * f1stTo2ndPosLenHist
Distance between cluster centers. 
const EigenVectors & getEigenVectors() const