/* Copyright (C) 2009 Diego Darriba This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package es.uvigo.darwin.prottest.util.fileio; import java.io.File; import java.util.List; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.PushbackReader; import java.io.PrintWriter; import pal.tree.Tree; import java.io.IOException; import es.uvigo.darwin.prottest.util.exception.ProtTestInternalException; import es.uvigo.darwin.prottest.util.exception.TreeFormatException; import es.uvigo.darwin.prottest.tree.WeightedTree; /** * * @author Diego Darriba */ public class SimpleNewickTreeReader extends TreeReader { /** The first element. */ private static final int FIRST = 0; public SimpleNewickTreeReader(File treeFile) throws ProtTestInternalException, IOException { FileReader fr = new FileReader(treeFile); BufferedReader br = new BufferedReader(fr); //PushbackReader in = new PushbackReader(fr); try { while (br.ready()) { String line = br.readLine(); if (line == null || line.equals("")) { break; } line = line.replace('[', ';'); line = line.replace(']', ';'); String[] values = line.split(";"); String weightStr = values[1]; double weight; weight = Double.parseDouble(weightStr); File tempFile = File.createTempFile("consensus", "tmp"); tempFile.deleteOnExit(); FileWriter fw = new FileWriter(tempFile); BufferedWriter bw = new BufferedWriter(fw); bw.write(values[0]); bw.append(';'); bw.close(); fw.close(); PushbackReader in = new PushbackReader(new FileReader(tempFile)); PrintWriter out = new PrintWriter(System.out); Tree tree = AlignmentReader.readTree(out, in, false); out.flush(); addTree(trees, new WeightedTree(tree, weight)); } } catch (TreeFormatException tfe) { throw new ProtTestInternalException("Bad file format. Cannot parse tree"); } catch (NumberFormatException nfe) { throw new ProtTestInternalException("Bad file format. Expecting double value"); } catch (IOException e) { e.printStackTrace(); } } /** * Adds a weighted tree to the set. * * @param wTree the weighted tree * * @return true, if successful */ private boolean addTree(List<WeightedTree> trees, WeightedTree wTree) { //check integrity if (wTree.getTree() == null || wTree.getWeight() < 0.0) { throw new ProtTestInternalException(); } //check compatibility if (trees.size() == 0) { trees.add(wTree); numTaxa = wTree.getTree().getIdCount(); idGroup = pal.tree.TreeUtils.getLeafIdGroup(wTree.getTree()); } else { if (wTree.getTree().getIdCount() != numTaxa) { return false; } Tree pTree = trees.get(FIRST).getTree(); for (int i = 0; i < numTaxa; i++) { boolean found = false; for (int j = 0; j < numTaxa; j++) { if (wTree.getTree().getIdentifier(i).equals(pTree.getIdentifier(j))) { found = true; break; } } if (!found) { System.out.println("NOT COMPATIBLE TREES"); return false; } } trees.add(wTree); } cumWeight += wTree.getWeight(); return true; } }