Пример #1
0
ShapeFunctionTable::ShapeFunctionTable(int ngauss, int nsf)
  : f_table(ngauss, DoubleVec(nsf)),
    df_table(ngauss, std::vector<DoubleVec>(nsf, DoubleVec(DIM)))
{
}
Пример #2
0
//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);
                }
            }
        }

    }

}