Find the best layer for splitting the cluster. 
   43     const OrderedCaloHitList &orderedCaloHitList(pCluster->GetOrderedCaloHitList());
    46         return STATUS_CODE_NOT_FOUND;
    48     bool foundSplit(
false);
    50     float bestCosTheta(1.
f);
    51     CartesianVector bestPosition(0.
f, 0.
f, 0.
f);
    53     for (
unsigned int iLayer = pCluster->GetInnerPseudoLayer() + 4; iLayer + 4 <= pCluster->GetOuterPseudoLayer(); ++iLayer)
    55         if (orderedCaloHitList.find(iLayer) == orderedCaloHitList.end())
    58         unsigned int innerLayer((pCluster->GetInnerPseudoLayer() + 
m_layerWindow > iLayer) ? pCluster->GetInnerPseudoLayer() : iLayer - 
m_layerWindow);
    59         unsigned int outerLayer((iLayer + 
m_layerWindow > pCluster->GetOuterPseudoLayer()) ? pCluster->GetOuterPseudoLayer() : iLayer + 
m_layerWindow);
    61         for (; innerLayer >= pCluster->GetInnerPseudoLayer(); --innerLayer)
    63             if (orderedCaloHitList.find(innerLayer) != orderedCaloHitList.end())
    67         for (; outerLayer <= pCluster->GetOuterPseudoLayer(); ++outerLayer)
    69             if (orderedCaloHitList.find(outerLayer) != orderedCaloHitList.end())
    73         const CartesianVector splitPosition(pCluster->GetCentroid(iLayer));
    74         const CartesianVector innerPosition(pCluster->GetCentroid(innerLayer));
    75         const CartesianVector outerPosition(pCluster->GetCentroid(outerLayer));
    77         const CartesianVector r1(innerPosition - splitPosition);
    78         const CartesianVector r2(outerPosition - splitPosition);
    79         const CartesianVector p1(r1.GetUnitVector());
    80         const CartesianVector p2(r2.GetUnitVector());
    82         const float cosTheta(-p1.GetDotProduct(p2));
    83         const float rms1(this->
CalculateRms(pCluster, innerLayer, iLayer));
    84         const float rms2(this->
CalculateRms(pCluster, outerLayer, iLayer));
    99         if (
rms < rmsCut && cosTheta < bestCosTheta)
   101             bestCosTheta = cosTheta;
   102             bestPosition = splitPosition;
   110         return STATUS_CODE_NOT_FOUND;
   112     return STATUS_CODE_SUCCESS;
 
double rms(sqlite3 *db, std::string const &table_name, std::string const &column_name)
 
unsigned int m_minClusterLayers
 
float m_maxScatterCosTheta
 
static int max(int a, int b)
 
unsigned int m_layerWindow
 
float CalculateRms(const pandora::Cluster *const pCluster, const unsigned int &firstLayer, const unsigned int &secondLayer) const 
Calculate rms deviation of cluster centroids between two extremal layers. 
 
float m_maxSlidingCosTheta