ShapeFunctionTable::ShapeFunctionTable(int ngauss, int nsf) : f_table(ngauss, DoubleVec(nsf)), df_table(ngauss, std::vector<DoubleVec>(nsf, DoubleVec(DIM))) { }
//Function to initialize the Felsenstein Pruning Tables on the Inner Nodes of the Tree //This is not done simulataneously with the tree creation because the Substitution Matrices are needed for the //Felsenstein Probablilities estimation, and for these, the corresponding branch lengths are required (i.e. the tree has to be fully created first) void PairInitializer::InitTreeFPTables() { //Nodes A, B, C and D { for (int k=0;k<4;k++){ FTree->Get_TreeNodes()[k].N1.FPTable.resize(4, DoubleVec(Seqs->Get_BareSeqs()[k].size(),0)); for (int i=0; i<Seqs->Get_BareSeqs()[k].size(); i++) { FTree->Get_TreeNodes()[k].N1.FPTable[GetAlphabet(Seqs->Get_BareSeqs()[k][i])][i]= 1.0; } FTree->Get_TreeNodes()[k].N2.FPTable.resize(4, DoubleVec(Seqs->Get_BareSeqs()[k].size(),0)); FTree->Get_TreeNodes()[k].N3.FPTable.resize(4, DoubleVec(Seqs->Get_BareSeqs()[k].size(),0)); } } //Node E { //InnerNode N1 conditioned on Nodes A and B double len1 = FTree->Get_TreeNodes()[4].N2.Length; int idx1 = GetPosOfElement(OverallSubMatsLengths, len1, 0); double len2 = FTree->Get_TreeNodes()[4].N3.Length; int idx2 = GetPosOfElement(OverallSubMatsLengths, len2, 0); FTree->Get_TreeNodes()[4].N1.FPTable.resize(4, DoubleVec(0,0)); for (int j=0; j<AlignmentHomologies[4].size(); j++) { if (AlignmentHomologies[4][j]==-1) { continue; } for (int i=0; i<4; i++) { //For each possibility, meaning A,C,G or T double prob = 1; if (AlignmentHomologies[0][j]!=-1) { prob *= OverallSubMats[idx1][GetAlphabetPair(i, Seqs->Get_BareSeqs()[0][AlignmentHomologies[0][j]-1])]; } if (AlignmentHomologies[1][j]!=-1) { prob *= OverallSubMats[idx2][GetAlphabetPair(i, Seqs->Get_BareSeqs()[1][AlignmentHomologies[1][j]-1])]; } FTree->Get_TreeNodes()[4].N1.FPTable[i].push_back(prob); } } } //Node 6 { //InnerNode N1 conditioned on Nodes C and D double len1 = FTree->Get_TreeNodes()[5].N2.Length; int idx1 = GetPosOfElement(OverallSubMatsLengths, len1, 0); double len2 = FTree->Get_TreeNodes()[5].N3.Length; int idx2 = GetPosOfElement(OverallSubMatsLengths, len2, 0); FTree->Get_TreeNodes()[5].N1.FPTable.resize(4, DoubleVec(0,0)); for (int j=0; j<AlignmentHomologies[5].size(); j++) { if (AlignmentHomologies[5][j]==-1) { continue; } for (int i=0; i<4; i++) { //For each possibility, meaning A,C,G or T double prob = 1; if (AlignmentHomologies[2][j]!=-1) { prob *= OverallSubMats[idx1][GetAlphabetPair(i, Seqs->Get_BareSeqs()[2][AlignmentHomologies[2][j]-1])]; } if (AlignmentHomologies[3][j]!=-1) { prob *= OverallSubMats[idx2][GetAlphabetPair(i, Seqs->Get_BareSeqs()[3][AlignmentHomologies[3][j]-1])]; } FTree->Get_TreeNodes()[5].N1.FPTable[i].push_back(prob); } } } //Node 5 - InnerNodes N2 and N3 { //InnerNode N2 conditioned on Nodes B, C and D { double len1 = FTree->Get_TreeNodes()[4].N3.Length; int idx1 = GetPosOfElement(OverallSubMatsLengths, len1, 0); double len2 = FTree->Get_TreeNodes()[4].N1.Length; int idx2 = GetPosOfElement(OverallSubMatsLengths, len2, 0); FTree->Get_TreeNodes()[4].N2.FPTable.resize(4, DoubleVec(0,0)); for (int j=0; j<AlignmentHomologies[4].size(); j++) { if (AlignmentHomologies[4][j]==-1) { continue; } for (int i=0; i<4; i++) { //For each possibility, meaning A,C,G or T double prob = 1; if (AlignmentHomologies[1][j]!=-1) { prob *= OverallSubMats[idx1][GetAlphabetPair(i, Seqs->Get_BareSeqs()[1][AlignmentHomologies[1][j]-1])]; } //if (FTree->Get_TreeNodes()[4]->Get_Homologies()[5][j]!=-1) { if (AlignmentHomologies[5][j]!=-1) { double sum = 0; for (int k=0; k<4; k++) { sum += OverallSubMats[idx2][GetAlphabetPair(i, k)]* (FTree->Get_TreeNodes()[5].N1.FPTable[k][AlignmentHomologies[5][j]-1]); } prob *= sum; } FTree->Get_TreeNodes()[4].N2.FPTable[i].push_back(prob); } } } //InnerNode N3 conditioned on Nodes A, C and D { double len1 = FTree->Get_TreeNodes()[4].N2.Length; int idx1 = GetPosOfElement(OverallSubMatsLengths, len1, 0); double len2 = FTree->Get_TreeNodes()[4].N1.Length; int idx2 = GetPosOfElement(OverallSubMatsLengths, len2, 0); FTree->Get_TreeNodes()[4].N3.FPTable.resize(4, DoubleVec(0,0)); for (int j=0; j<AlignmentHomologies[4].size(); j++) { if (AlignmentHomologies[4][j]==-1) { continue; } for (int i=0; i<4; i++) { //For each possibility, meaning A,C,G or T double prob = 1; if (AlignmentHomologies[0][j]!=-1) { prob *= OverallSubMats[idx1][GetAlphabetPair(i, Seqs->Get_BareSeqs()[0][AlignmentHomologies[0][j]-1])]; } if (AlignmentHomologies[5][j]!=-1) { double sum = 0; for (int k=0; k<4; k++) { sum += OverallSubMats[idx2][GetAlphabetPair(i, k)]* (FTree->Get_TreeNodes()[5].N1.FPTable[k][AlignmentHomologies[5][j]-1]); } prob *= sum; } FTree->Get_TreeNodes()[4].N3.FPTable[i].push_back(prob); } } } } //Node 6 - InnerNodes N2 and N3 { //InnerNode N2 conditioned on Nodes A, B and D { double len1 = FTree->Get_TreeNodes()[5].N3.Length; int idx1 = GetPosOfElement(OverallSubMatsLengths, len1, 0); double len2 = FTree->Get_TreeNodes()[5].N1.Length; int idx2 = GetPosOfElement(OverallSubMatsLengths, len2, 0); FTree->Get_TreeNodes()[5].N2.FPTable.resize(4, DoubleVec(0,0)); for (int j=0; j<AlignmentHomologies[5].size(); j++) { if (AlignmentHomologies[5][j]==-1) { continue; } for (int i=0; i<4; i++) { //For each possibility, meaning A,C,G or T double prob = 1; if (AlignmentHomologies[3][j]!=-1) { prob *= OverallSubMats[idx1][GetAlphabetPair(i, Seqs->Get_BareSeqs()[3][AlignmentHomologies[3][j]-1])]; } if (AlignmentHomologies[4][j]!=-1) { double sum = 0; for (int k=0; k<4; k++) { sum += OverallSubMats[idx2][GetAlphabetPair(i, k)]* (FTree->Get_TreeNodes()[4].N1.FPTable[k][AlignmentHomologies[4][j]-1]); } prob *= sum; } FTree->Get_TreeNodes()[5].N2.FPTable[i].push_back(prob); } } } //InnerNode N3 conditioned on Nodes A, B and C { double len1 = FTree->Get_TreeNodes()[5].N2.Length; int idx1 = GetPosOfElement(OverallSubMatsLengths, len1, 0); double len2 = FTree->Get_TreeNodes()[5].N1.Length; int idx2 = GetPosOfElement(OverallSubMatsLengths, len2, 0); FTree->Get_TreeNodes()[5].N3.FPTable.resize(4, DoubleVec(0,0)); for (int j=0; j<AlignmentHomologies[5].size(); j++) { if (AlignmentHomologies[5][j]==-1) { continue; } for (int i=0; i<4; i++) { //For each possibility, meaning A,C,G or T double prob = 1; if (AlignmentHomologies[2][j]!=-1) { prob *= OverallSubMats[idx1][GetAlphabetPair(i, Seqs->Get_BareSeqs()[2][AlignmentHomologies[2][j]-1])]; } if (AlignmentHomologies[4][j]!=-1) { double sum = 0; for (int k=0; k<4; k++) { sum += OverallSubMats[idx2][GetAlphabetPair(i, k)]* (FTree->Get_TreeNodes()[4].N1.FPTable[k][AlignmentHomologies[4][j]-1]); } prob *= sum; } FTree->Get_TreeNodes()[5].N3.FPTable[i].push_back(prob); } } } } }