private CallTree root() {
        if (this.nodeList.isEmpty()) {
            // WARNING what wrong ?
            logger.warn("Not found span, node list is empty");
            traceState.progress();
            return this.metaSpanCallTreeFactory.unknown(0);
        }

        // find root
        final NodeList rootNodeList = nodeList.filter(NodeList.rootFilter());
        if (!rootNodeList.isEmpty()) {
            return selectInRootNodeList(rootNodeList, true);
        }

        // Corner case : root node not found
        final NodeList unlinkedNodeList = this.nodeList.filter(NodeList.unlinkFilter());
        logger.debug("unlinkNode {}/{}", unlinkedNodeList.size(), this.nodeList.size());
        if (unlinkedNodeList.isEmpty()) {
            // WARNING recursive link ?
            logger.warn("Not found top node, unlink={} node list={}", unlinkedNodeList.size(), this.nodeList);
            traceState.progress();
            return this.metaSpanCallTreeFactory.unknown(0);
        } else if (unlinkedNodeList.size() == 1) {
            // best matching
            return selectFirstSpan(unlinkedNodeList);
        }
        return selectJustSpan(unlinkedNodeList);
    }
@author netspider
@author emeroad
@author jaehong.kim
web/src/main/java/com/navercorp/pinpoint/web/calltree/span/SpanAligner.java