4 * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson.
10 #include "RootedGuideTree.h"
11 #include "../../general/userparams.h"
17 RootedGuideTree::RootedGuideTree()
20 RootedGuideTree::RootedGuideTree(Node* r)
23 RootedGuideTree::~RootedGuideTree()
28 void RootedGuideTree::setRoot(Node* r)
35 void RootedGuideTree::makeEmpty()
40 void RootedGuideTree::orderNodes()
45 int RootedGuideTree::calcOrderNode(Node* node)
49 if(node->getLeft() == 0 && node->getRight() == 0) // Leaf Node
56 node->setOrder(calcOrderNode(node->getLeft()) + calcOrderNode(node->getRight()));
57 return node->getOrder();
63 void RootedGuideTree::calcSeqWeights(int firstSeq, int lastSeq, vector<int>* seqWeights)
65 if((int)seqWeights->size() < lastSeq - 1)
67 seqWeights->resize(lastSeq - 1);
70 int i = 0, _nSeqs = 0;
71 int temp = 0, sum = 0;
73 // If there are more than three sequences....
75 _nSeqs = lastSeq - firstSeq;
76 if ((_nSeqs >= 2) && (userParameters->getDistanceTree() == true) &&
77 (userParameters->getNoWeights() == false))
80 // Calculate sequence weights based on Phylip tree.
83 calcWeights(seqWeights);
86 // Normalise the weights, such that the sum of the weights = INT_SCALE_FACTOR
90 for (i = firstSeq; i < lastSeq; i++)
92 sum += (*seqWeights)[i];
97 for (i = firstSeq; i < lastSeq; i++)
104 for (i = firstSeq; i < lastSeq; i++)
106 (*seqWeights)[i] = ((*seqWeights)[i] * INT_SCALE_FACTOR) / sum;
107 if ((*seqWeights)[i] < 1)
109 (*seqWeights)[i] = 1;
116 // Otherwise, use identity weights.
118 temp = INT_SCALE_FACTOR / _nSeqs;
119 // AW 2009-07-09: goes wrong if we have more than
120 // INT_SCALE_FACTOR seqs. if so, set to 1, just as above
121 // same as in Tree.cpp
126 for (i = firstSeq; i < lastSeq; i++)
128 (*seqWeights)[i] = temp;
133 void RootedGuideTree::calcWeights(vector<int>* seqWeights)
135 vector<float> weights;
136 int sizeSeqWeights = seqWeights->size();
137 weights.resize(sizeSeqWeights, 0.0);
139 doWeightCalc(0.0, &weights, root);
141 for(int i = 0; i < sizeSeqWeights; i++)
143 (*seqWeights)[i] = static_cast<int>(weights[i] * 100);
147 void RootedGuideTree::doWeightCalc(float weightSoFar, vector<float>* weights, Node* t)
151 if(t->getLeft() == 0 && t->getRight() == 0) // Leaf Node
153 (*weights)[t->getSeqNum() - 1] = weightSoFar;
155 else // Internal node
157 float w = weightSoFar + (t->getHeight() / t->getOrder());
158 doWeightCalc(w, weights, t->getLeft());
159 doWeightCalc(w, weights, t->getRight());