001 package calhoun.analysis.crf.features.supporting.phylogenetic;
002 import java.io.IOException;
003 import java.io.Serializable;
004
005 import org.apache.commons.logging.Log;
006 import org.apache.commons.logging.LogFactory;
007
008 import calhoun.util.Assert;
009
010 public class PhylogeneticTreeFelsensteinOrder implements Serializable {
011 private static final long serialVersionUID = -2394371116379001213L;
012 private static final Log log = LogFactory.getLog(PhylogeneticTreeFelsensteinOrder.class);
013 /* For now, hardcoded for the phylogeny and relative branch lengths of the
014 * aligned cryptococcus serotypes. However, all that is needed to make this
015 * general is a parser for NSF formatted descriptions of trees and a comparison
016 * to the order of species in the multiple alignment.
017 */
018
019 int[] ileft,iright;
020 double[] bleft,bright;
021 int nSpecies,nSteps,nNodes;
022
023 public PhylogeneticTreeFelsensteinOrder() {
024 // Below is a representation of the crypto tree which I got from Dan:
025 // ((cnBB: 0.034084, cnBV: 0.034065): 0.186256, cnA: 0.081165, cnDT: 0.071992):0.0;
026 // Below is the one I'll be using since it has all 5 species:
027 // (((cnDT:0.0025,cnDS:0.0025):0.0475,cnAB:0.05):0.02,(cnBB:0.02,cnBV:0.02):0.05):0;
028
029 // the order of species in the multiple alignment is cnDT,cnDS,cnA,cnBB,cnBV
030
031 // Would be nice to figure out the sequence of four steps below given the string
032 // representing the phylogenetic tree (NSF format) and the order of species in the multiple alignment column
033 // 5 = (0,0.0025 ; 1,0.0025)
034 // 6 = (5,0.0475 ; 2,0.05)
035 // 7 = (3,0.02 ; 4,0.02)
036 // 8 = (6,0.02 ; 7,0.05)
037
038 ileft = new int[]{0,5,3,6};
039 iright = new int[]{1,2,4,7};
040 bleft = new double[]{0.0025,0.0475,0.02,0.02};
041 bright = new double[]{0.0025,0.05,0.02,0.05};
042
043 setup();
044 }
045
046 public PhylogeneticTreeFelsensteinOrder(int[] ileft, int[] iright, double[] bleft, double[] bright) {
047 this.ileft = ileft;
048 this.iright = iright;
049 this.bleft = bleft;
050 this.bright = bright;
051
052 setup();
053 }
054
055 public void summarize() throws IOException {
056 log.debug("Summary of an order-of-computations object for Felsenstein recursion");
057 log.debug("Number of species: " + nSpecies);
058 log.debug("Number of steps: " + nSteps);
059 log.debug("Number of nodes: " + nNodes);
060 log.debug(" Nodes 0 to " + (nSpecies-1) + " are given.");
061 //for (int j=0; j<nSpecies; j++) {
062 // stream.println(" Node " + j + " is given");
063 //}
064 for (int step=0; step<nSteps; step++) {
065 log.debug(" Node " + (nSpecies + step) + " combines nodes " + ileft[step] + " and " + iright[step] +
066 " with branchlengths " + bleft[step] + " and " + bright[step]);
067 }
068 }
069
070 private void setup() {
071 nSteps = ileft.length;
072 Assert.a(iright.length == nSteps);
073 Assert.a(bleft.length == nSteps);
074 Assert.a(bright.length == nSteps);
075
076 nSpecies = nSteps+1;
077 nNodes = nSpecies + nSteps;
078 }
079
080 public int numSpecies() {
081 return nSpecies;
082 }
083
084 public int numSteps() {
085 return nSteps;
086 }
087
088 public int numNodes() {
089 return nNodes;
090 }
091
092 public int[] getileft() {
093 return ileft;
094 }
095
096 public int[] getiright() {
097 return iright;
098 }
099
100 public double[] getbleft() {
101 return bleft;
102 }
103
104 public double[] getbright() {
105 return bright;
106 }
107
108 }
109