mirror of
http://43.156.76.180:8026/YuuMJ/EukPhylo.git
synced 2025-12-28 04:20:25 +08:00
92 lines
3.5 KiB
C++
92 lines
3.5 KiB
C++
// $Id: distanceBasedSeqs2TreeFactory.cpp 1941 2007-04-15 14:17:22Z privmane $
|
|
#include "distanceBasedSeqs2TreeFactory.h"
|
|
#include "ssrvDistanceSeqs2Tree.h"
|
|
|
|
distanceBasedSeqs2Tree* distanceBasedSeqs2TreeFactory(const distanceBasedMethod_t distanceBasedMethod,
|
|
stochasticProcess& sp, // may change sp (alpha and/or nu)
|
|
const bool useJcDistance,
|
|
const bool optimizeAlpha,
|
|
const bool useSSRV,
|
|
const double epsilonLikelihoodImprovement4iterNJ,
|
|
const double epsilonLikelihoodImprovement4pairwiseDistance,
|
|
const double epsilonLikelihoodImprovement4alphaOptimiz,
|
|
const double epsilonLikelihoodImprovement4BBL,
|
|
const int maxIterationsBBL)
|
|
{
|
|
|
|
// 1. Construct the object of the requested distance-based tree-reconstruction method (class distances2Tree)
|
|
NJalg NJa;
|
|
distances2Tree* d2tPtr = &NJa; // for future polymorphism
|
|
|
|
// 2. Construct the object of the requested distance estimation method (class distanceMethod) distanceMethod *dmPtr = NULL;
|
|
// And construct the object of the distance-based sequences-to-tree method (class distanceBasedSeqs2Tree)
|
|
// distanceMethod *dmPtr = NULL;
|
|
distanceBasedSeqs2Tree *s2tPtr = NULL;
|
|
|
|
|
|
switch (distanceBasedMethod) {
|
|
case homogeneousRatesDTME:
|
|
if (useJcDistance) {
|
|
jcDistance jcd;
|
|
s2tPtr = new distanceBasedSeqs2Tree(jcd, *d2tPtr);
|
|
} else {
|
|
likeDist ld(sp,epsilonLikelihoodImprovement4pairwiseDistance);
|
|
s2tPtr = new distanceBasedSeqs2Tree(ld, *d2tPtr);
|
|
|
|
}
|
|
break;
|
|
case pairwiseGammaDTME:
|
|
if (optimizeAlpha) {
|
|
pairwiseGammaDistance pgd(sp,epsilonLikelihoodImprovement4pairwiseDistance); // distance method that optimizes alpha for the pair of sequences
|
|
s2tPtr = new distanceBasedSeqs2Tree(pgd, *d2tPtr);
|
|
} else {
|
|
likeDist ld1(sp,epsilonLikelihoodImprovement4pairwiseDistance); // distance method that uses the given alpha with no optimization
|
|
s2tPtr = new distanceBasedSeqs2Tree(ld1, *d2tPtr);
|
|
}
|
|
break;
|
|
case commonAlphaDTME: {
|
|
if (!useSSRV) {
|
|
likeDist ld2(sp,epsilonLikelihoodImprovement4pairwiseDistance);
|
|
s2tPtr = new commonAlphaDistanceSeqs2Tree(ld2, *d2tPtr, NULL,
|
|
epsilonLikelihoodImprovement4iterNJ,
|
|
epsilonLikelihoodImprovement4alphaOptimiz,
|
|
epsilonLikelihoodImprovement4BBL,
|
|
maxIterationsBBL);
|
|
} else {
|
|
likeDist ld3(sp,epsilonLikelihoodImprovement4pairwiseDistance);
|
|
s2tPtr = new ssrvDistanceSeqs2Tree(ld3, *d2tPtr, NULL,
|
|
epsilonLikelihoodImprovement4iterNJ,
|
|
epsilonLikelihoodImprovement4alphaOptimiz,
|
|
epsilonLikelihoodImprovement4BBL,
|
|
maxIterationsBBL);
|
|
|
|
}
|
|
}
|
|
break;
|
|
case rate4siteDTME: {
|
|
givenRatesMLDistance grd(sp,epsilonLikelihoodImprovement4pairwiseDistance);
|
|
s2tPtr = new rate4siteDistanceSeqs2Tree(grd, *d2tPtr, NULL,
|
|
epsilonLikelihoodImprovement4iterNJ,
|
|
epsilonLikelihoodImprovement4alphaOptimiz,
|
|
epsilonLikelihoodImprovement4BBL,
|
|
maxIterationsBBL); }
|
|
break;
|
|
case posteriorDTME: {
|
|
posteriorDistance posd(sp,epsilonLikelihoodImprovement4pairwiseDistance);
|
|
s2tPtr = new posteriorDistanceSeqs2Tree(posd, *d2tPtr, NULL,
|
|
epsilonLikelihoodImprovement4iterNJ,
|
|
epsilonLikelihoodImprovement4alphaOptimiz,
|
|
epsilonLikelihoodImprovement4BBL,
|
|
maxIterationsBBL);}
|
|
break;
|
|
default: errorMsg::reportError("bad distanceBasedMethod - method not in the list of implimented methods");
|
|
}
|
|
return s2tPtr;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|