Библиотека Java или код для разбора формата Newick? - PullRequest
2 голосов
/ 08 октября 2010

Кто-нибудь знает хорошую библиотеку Java, которую я могу использовать для простого анализа файла Newick?Или, если у вас есть какой-нибудь проверенный исходный код, который я мог бы использовать?

Я хочу прочитать файл newick: http://en.wikipedia.org/wiki/Newick_format в java и сгенерировать его визуальное представление.Я видел несколько java-программ, которые делают это, но не так-то просто найти, как синтаксический анализ работает в коде.

Ответы [ 5 ]

2 голосов
/ 04 ноября 2011

Проверьте Jebl (Java Evolutionary Biology Library) из FigTree и BEAST славы.Возможно, гораздо больше функций дерева, чем вам может понадобиться, но это солидная библиотека.

1 голос
/ 27 сентября 2012

Наткнулся на этот вопрос, когда искал парсер Java Newick.

Я также сталкивался с libnewicktree , который является обновленной версией синтаксического анализатора Newick от Juxtaposer.

0 голосов
/ 01 января 2017

Вот парсер Newick, который я написал для личного использования. Используйте это в добром здравии; визуализация не включена.

import java.util.ArrayList;

/**
 * Created on 12/18/16
 *
 * @author @author <a href="mailto:knapp@american.edu">Adam Knapp</a>
 * @version 0.1
 */
public class NewickTree {

    private static int node_uuid = 0;
    ArrayList<Node> nodeList = new ArrayList<>();
    private Node root;

    static NewickTree readNewickFormat(String newick) {
        return new NewickTree().innerReadNewickFormat(newick);
    }

    private static String[] split(String s) {

        ArrayList<Integer> splitIndices = new ArrayList<>();

        int rightParenCount = 0;
        int leftParenCount = 0;
        for (int i = 0; i < s.length(); i++) {
            switch (s.charAt(i)) {
                case '(':
                    leftParenCount++;
                    break;
                case ')':
                    rightParenCount++;
                    break;
                case ',':
                    if (leftParenCount == rightParenCount) splitIndices.add(i);
                    break;
            }
        }

        int numSplits = splitIndices.size() + 1;
        String[] splits = new String[numSplits];

        if (numSplits == 1) {
            splits[0] = s;
        } else {

            splits[0] = s.substring(0, splitIndices.get(0));

            for (int i = 1; i < splitIndices.size(); i++) {
                splits[i] = s.substring(splitIndices.get(i - 1) + 1, splitIndices.get(i));
            }

            splits[numSplits - 1] = s.substring(splitIndices.get(splitIndices.size() - 1) + 1);
        }

        return splits;
    }

    private NewickTree innerReadNewickFormat(String newick) {

        // single branch = subtree (?)
        this.root = readSubtree(newick.substring(0, newick.length() - 1));

        return this;
    }

    private Node readSubtree(String s) {

        int leftParen = s.indexOf('(');
        int rightParen = s.lastIndexOf(')');

        if (leftParen != -1 && rightParen != -1) {

            String name = s.substring(rightParen + 1);
            String[] childrenString = split(s.substring(leftParen + 1, rightParen));

            Node node = new Node(name);
            node.children = new ArrayList<>();
            for (String sub : childrenString) {
                Node child = readSubtree(sub);
                node.children.add(child);
                child.parent = node;
            }

            nodeList.add(node);
            return node;
        } else if (leftParen == rightParen) {

            Node node = new Node(s);
            nodeList.add(node);
            return node;

        } else throw new RuntimeException("unbalanced ()'s");
    }

    static class Node {
        final String name;
        final int weight;
        boolean realName = false;
        ArrayList<Node> children;
        Node parent;

        /**
         * @param name name in "actualName:weight" format, weight defaults to zero if colon absent
         */
        Node(String name) {

            int colonIndex = name.indexOf(':');
            String actualNameText;
            if (colonIndex == -1) {
                actualNameText = name;
                weight = 0;
            } else {
                actualNameText = name.substring(0, colonIndex);
                weight = Integer.parseInt(name.substring(colonIndex + 1, name.length()));
            }

            if (actualNameText.equals("")) {
                this.realName = false;
                this.name = Integer.toString(node_uuid);
                node_uuid++;
            } else {
                this.realName = true;
                this.name = actualNameText;
            }
        }

        @Override
        public int hashCode() {
            return name.hashCode();
        }

        @Override
        public boolean equals(Object o) {
            if (!(o instanceof Node)) return false;
            Node other = (Node) o;
            return this.name.equals(other.name);
        }

        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            if (children != null && children.size() > 0) {
                sb.append("(");
                for (int i = 0; i < children.size() - 1; i++) {
                    sb.append(children.get(i).toString());
                    sb.append(",");
                }
                sb.append(children.get(children.size() - 1).toString());
                sb.append(")");
            }
            if (name != null) sb.append(this.getName());
            return sb.toString();
        }

        String getName() {
            if (realName)
                return name;
            else
                return "";
        }
    }

    @Override
    public String toString() {
        return root.toString() + ";";
    }

}
0 голосов
/ 01 июня 2015

Мне нравится использовать библиотеку Archeopteryx на основе библиотек forester .Это может сделать намного больше, чем анализ и визуализация деревьев, но его использование остается очень простым даже для базовых задач:

import java.io.IOException;    
import org.forester.archaeopteryx.Archaeopteryx;
import org.forester.phylogeny.Phylogeny;

public class PhylogenyTree {
    public static void main(String[] args) throws IOException{
        String nhx = "(mammal,(turtle,rayfinfish,(frog,salamander)))";
        Phylogeny ph = Phylogeny.createInstanceFromNhxString(nhx);
        Archaeopteryx.createApplication(ph);
    }

}
0 голосов
/ 08 октября 2010

Похоже на Tree Juxtaposer включает в себя newick синтаксический анализатор дерева (однако ограничен только одним деревом на файл).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...