+/**
+ * Author: Mark Larkin
+ *
+ * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson.
+ */
+/**
+ * Changes:
+ * Mark 10-5-2007: Bug fix # 42. Added getWeightsForQtLowScore function.
+ *
+ *
+ */
+#ifndef TREEINTERFACE_H
+#define TREEINTERFACE_H
+
+#include <vector>
+#include <string>
+#include <memory>
+#include "AlignmentSteps.h"
+#include "../alignment/Alignment.h"
+#include "../general/clustalw.h"
+
+namespace clustalw
+{
+
+using namespace std;
+class Tree;
+class RootedGuideTree;
+
+class TreeInterface
+{
+ public:
+ /**
+ * This function will be used to generate the phylogenetic tree from the distMat using
+ * either UPGMA or NJ. It will then calculate the seqWeights and the steps.
+ * Note the Distmat
+ * will be in similarity form after this. It will no longer be distances!!!!!
+ */
+ auto_ptr<AlignmentSteps> getWeightsAndStepsFromDistMat(vector<int>* seqWeights,
+ DistMatrix* distMat,
+ Alignment *alignPtr,
+ int seq1, int nSeqs,
+ string* phylipName, bool* success);
+ /**
+ * This will be called by sequencesAlignToProfile and QTcalcWeightsForLowScoreSeg
+ */
+ void getWeightsFromDistMat(vector<int>* seqWeights, DistMatrix* distMat,
+ Alignment *alignPtr, int seq1, int nSeqs,
+ string* phylipName, bool* success);
+
+ void getWeightsForQtLowScore(vector<int>* seqWeights, DistMatrix* distMat,
+ Alignment *alignPtr, int seq1, int nSeqs,
+ string* phylipName, bool* success);
+
+ /**
+ * This function will be called from doAlignUseOldTree
+ */
+ auto_ptr<AlignmentSteps> getWeightsAndStepsFromTree(Alignment* alignPtr,
+ DistMatrix* distMat, string* treeName,
+ vector<int>* seqWeights, int fSeq,
+ int numSeqs, bool* success);
+
+ /**
+ * This function will be called from sequencesAlignToProfile, it doesnt calc the
+ * steps.
+ */
+ int getWeightsFromGuideTree(Alignment* alignPtr, DistMatrix* distMat,
+ string* treeName, vector<int>* seqWeights, int fSeq,
+ int nSeqs, bool* success);
+ /**
+ * This function is used to generate 2 guide trees for the profile align part.
+ * IT must be done on its own. It calls calcPairwiseForProfileAlign in MSA.
+ * It is called by profileAlign and removeFirstIterate.
+ */
+ void getWeightsForProfileAlign(Alignment* alignPtr, DistMatrix* distMat,
+ string* p1TreeName, vector<int>* p1Weights, string* p2TreeName,
+ vector<int>* p2Weights, int numSeqs, int profile1NumSeqs, bool useTree1,
+ bool useTree2, bool* success);
+ /**
+ * This function is used to generate the guide tree from the distance matrix.
+ * It doesnt return
+ * any seqWeights or AlignmentSteps. It will be used by doGuideTreeOnly
+ */
+ void generateTreeFromDistMat(DistMatrix* distMat, Alignment *alignPtr,
+ int seq1, int nSeqs,
+ string* phylipName, bool* success);
+
+ /**
+ * This function is to simply to call either the UPGMA or NJ version of
+ * this function, and print out all the trees. It will be called
+ * from phylogeneticTree in the clustal class.
+ */
+ void treeFromAlignment(TreeNames* treeNames, Alignment *alignPtr);
+
+ /**
+ * This function will be used to bootstrap the tree and output the results.
+ * It will use either
+ * UPGMA or NJ for the bootstrapping, depending on what is selected.
+ */
+ void bootstrapTree(TreeNames* treeNames, Alignment *alignPtr);
+
+ private:
+ auto_ptr<AlignmentSteps> getWeightsAndStepsFromDistMatNJ(vector<int>* seqWeights,
+ DistMatrix* distMat,
+ Alignment *alignPtr,
+ int seq1, int nSeqs,
+ string* phylipName, bool* success);
+
+ auto_ptr<AlignmentSteps> getWeightsAndStepsUseOldGuideTreeNJ(DistMatrix* distMat,
+ Alignment *alignPtr, string* treeName,
+ vector<int>* seqWeights,
+ int fSeq, int nSeqs, bool* success);
+
+ int readTreeAndCalcWeightsNJ(Tree* groupTree, Alignment* alignPtr,
+ DistMatrix* distMat, string* treeName, vector<int>* seqWeights,
+ int fSeq, int nSeqs);
+
+ int getWeightsFromGuideTreeNJ(Alignment* alignPtr, DistMatrix* distMat,
+ string* treeName, vector<int>* seqWeights, int fSeq,
+ int nSeqs, bool* success);
+
+ void getWeightsFromDistMatNJ(vector<int>* seqWeights, DistMatrix* distMat,
+ Alignment *alignPtr, int seq1, int nSeqs,
+ string* phylipName, bool* success);
+
+ void getWeightsForProfileAlignNJ(Alignment* alignPtr, DistMatrix* distMat,
+ string* p1TreeName, vector<int>* p1Weights, string* p2TreeName,
+ vector<int>* p2Weights, int numSeqs, int profile1NumSeqs, bool useTree1,
+ bool useTree2, bool* success);
+
+ void generateTreeFromDistMatNJ(DistMatrix* distMat, Alignment *alignPtr,
+ int seq1, int nSeqs, string* phylipName, bool* success);
+
+ auto_ptr<AlignmentSteps> getWeightsAndStepsFromTreeNJ(Alignment* alignPtr,
+ DistMatrix* distMat, string* treeName,
+ vector<int>* seqWeights, int fSeq, int numSeqs, bool* success);
+
+ /** UPGMA functions */
+ auto_ptr<AlignmentSteps> getWeightsAndStepsFromDistMatUPGMA(vector<int>* seqWeights,
+ DistMatrix* distMat, Alignment *alignPtr,
+ int seq1, int nSeqs, string* phylipName, bool* success);
+
+ auto_ptr<AlignmentSteps> generateTreeFromDistMatUPGMA(RootedGuideTree* guideTree,
+ DistMatrix* distMat, Alignment *alignPtr, int seq1, int nSeqs,
+ string* phylipName, bool* success);
+
+ void getWeightsFromDistMatUPGMA(vector<int>* seqWeights, DistMatrix* distMat,
+ Alignment *alignPtr, int seq1, int nSeqs,
+ string* phylipName, bool* success);
+
+ void getWeightsForProfileAlignUPGMA(Alignment* alignPtr, DistMatrix* distMat,
+ string* p1TreeName, vector<int>* p1Weights, string* p2TreeName,
+ vector<int>* p2Weights, int numSeqs, int profile1NumSeqs, bool useTree1,
+ bool useTree2, bool* success);
+};
+}
+#endif