/*
* TestParsimony.java
*
* Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* BEAST 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package dr.evolution.parsimony;
import dr.evolution.alignment.*;
import dr.evolution.io.NexusImporter;
import dr.evolution.tree.*;
import dr.evolution.datatype.PairedDataType;
import java.io.FileReader;
/**
* @author rambaut
* Date: Jun 21, 2005
* Time: 11:41:32 PM
*/
public class TestParsimony {
public final static String alignmentFileName = "ABLV.G.nuc";
public final static String treeFileName = "ABLV.G.tree";
public static void main(String[] args) throws Exception {
// read alignments
NexusImporter importer = new NexusImporter(new FileReader(alignmentFileName));
Alignment alignment = importer.importAlignment();
// alignment = new GapStrippedAlignment(alignment);
// read trees
Tree tree = null;
importer = new NexusImporter(new FileReader(treeFileName));
try {
tree = importer.importTree(alignment);
//((FlexibleTree)tree).resolveTree();
} catch (Exception e) {
System.err.println("Exception attempting to read tree: " + e.getMessage());
System.exit(0);
}
//testParsimony(new FitchParsimony(alignment, false), alignment, tree);
System.out.println("single:");
testParsimony(new SankoffParsimony(alignment), alignment, tree);
System.out.println("paired:");
testPairedSites(alignment, tree);
}
static void testPairedSites(SiteList siteList, Tree tree) {
ParsimonyCriterion singleParsimony = new SankoffParsimony(siteList);
double[] singleScores = singleParsimony.getSiteScores(tree);
PairedDataType pairedDataType = new PairedDataType(siteList.getDataType());
for (int i = 0; i < siteList.getSiteCount(); i++) {
if (singleScores[i] > 0) {
SimpleSiteList pairedSites = new SimpleSiteList(pairedDataType, siteList);
int[] siteIndices = new int[siteList.getSiteCount()];
int u = 0;
for (int j = i + 1; j < siteList.getSiteCount(); j++) {
if (singleScores[j] > 0) {
int[] pairedPattern = new int[siteList.getTaxonCount()];
int[] pattern1 = siteList.getSitePattern(i);
int[] pattern2 = siteList.getSitePattern(j);
for (int k = 0; k < pairedPattern.length; k ++) {
pairedPattern[k] = pairedDataType.getState(pattern1[k], pattern2[k]);
}
pairedSites.addPattern(pairedPattern);
siteIndices[u] = j;
u++;
}
}
//testParsimony(new FitchParsimony(pairedSites, false), pairedSites, tree);
ParsimonyCriterion parsimony = new SankoffParsimony(pairedSites);
double[] scores = parsimony.getSiteScores(tree);
for (int k = 0; k < pairedSites.getSiteCount(); k++) {
if (scores[k] > 1 /*&& isEpistatic(parsimony, pairedDataType, k, tree, tree.getRoot())*/) {
System.out.println("site {" + Integer.toString(i + 1) + ", " + Integer.toString(siteIndices[k] + 1) + "}: " + scores[k] + " steps");
showChanges(parsimony, k, tree, tree.getRoot());
}
}
}
}
}
static void testParsimony(ParsimonyCriterion parsimony, SiteList siteList, Tree tree) {
double[] scores = parsimony.getSiteScores(tree);
for (int i = 0; i < siteList.getSiteCount(); i++) {
if (scores[i] > 1) {
System.out.println("site" + i + " (" + scores[i] + " steps):");
showChanges(parsimony, i, tree, tree.getRoot());
}
}
}
static void showChanges(ParsimonyCriterion parsimony, int site, Tree tree, NodeRef node) {
if (node != tree.getRoot()) {
int stateB = parsimony.getStates(tree, node)[site];
int stateA = parsimony.getStates(tree, tree.getParent(node))[site];
if (stateA != stateB) {
if (tree.isExternal(node)) {
System.out.println("\tnode(" + tree.getParent(node).getNumber() + " -> " + tree.getNodeTaxon(node).getId() + "):\tstate" + "(" + stateA + " -> " + stateB + ")");
} else {
System.out.println("\tnode(" + tree.getParent(node).getNumber() + " -> " + node.getNumber() + "):\tstate" + "(" + stateA + " -> " + stateB + ")");
}
}
}
for (int j = 0; j < tree.getChildCount(node); j++) {
showChanges(parsimony, site, tree, tree.getChild(node, j));
}
}
}