void Clustering3D::clusterStartRecursive(SortingType sortingType)
{
    mClustersCenter.clear();
    mClustersTexCenter.clear();
    mClustersFlow.clear();
    mClusterSize.clear();
    mCluster6DSize.clear();
    mHeadSize.clear();

    PreciseTimer stat = PreciseTimer::currentTime();
    switch (sortingType)
    {
        case SORT_X:
            std::sort((*mCloud).begin(), (*mCloud).end(), SortSwarmPointX());
            break;
        case SORT_Y:
            std::sort((*mCloud).begin(), (*mCloud).end(), SortSwarmPointY());
            break;
        case SORT_Z:
            std::sort((*mCloud).begin(), (*mCloud).end(), SortSwarmPointZ());
            break;
        case NONE:
            break;
    }
    mSortingTime = stat.usecsTo(PreciseTimer::currentTime());

    for (unsigned i = 0; i < mCloud->size(); i++)
    {
        if ((*mCloud)[i].cluster != 0) {
            continue;
        }

        mIndexes.clear();
        mIndexes.push_back((int)i);
        clusteringRecursive(mDepth, 0, sortingType);
        if (mClusters.back().size() > mSize )
        {
            bool isGood = true;
            int sz = (int)mClustersCenter.size();
            mClusters.back().getStat();
            for (int i = 0; i < sz; i++)
            {
                // check if new cluster not down from previous
                if (fabs(mClusters.back().mClusterInfo.point.z() - mClustersCenter[i].z()) < mHeadArea &&
                    fabs(mClusters.back().mClusterInfo.point.x() - mClustersCenter[i].x()) < mHeadArea )
                    isGood = false;
            }
            if (isGood)
            {
                mClustersTexCenter.push_back(mClusters.back().mClusterInfo.texCoor);
                mClustersCenter.push_back(mClusters.back().mClusterInfo.point);
                mClustersFlow.push_back(mClusters.back().mClusterInfo.speed);
                mClusterSize.push_back((int)mClusters.back().size());
                mCluster6DSize.push_back(mClusters.back().m6Dpoints);
                vector<double> tmpVect = mClusters.back().mEllipse.mValues;
                double forMax = 0;
                for (unsigned i = 0; i < tmpVect.size(); i++)
                {
                    forMax = forMax < tmpVect[i] ? tmpVect[i] : forMax;
                }
                mHeadSize.push_back(forMax);
            }
            if (mClustersCenter.size() == mHeadNumber) break;
        }
    }
    mClusteringTime = stat.usecsTo(PreciseTimer::currentTime());
}