C: неизвестно, если проблема с оценкой - PullRequest
0 голосов
/ 07 января 2020

Это немного сложнее, но для краткости я пытаюсь создать согласованные последовательности для семейств последовательностей (строки, состоящие только из символов A, C, G и T), и я не могу определить, где функция, которую я сделал, не работает. Вот оно:

SEQUENCE calculate_cons(FAMILY FAM)
{
    SEQUENCE cons;
    int maxlenght=seq_with_max_char(FAM);

    for(int i=0; i<maxlenght; i++)
    {
        int nA=0;
        int nC=0;
        int nG=0;
        int nT=0;

        for(int j=0; j<FAM.size; j++)
        {
            if(FAM.seq[j].c[i]=='A')
            {
                nA++;
            }
            if(FAM.seq[j].c[i]=='C')
            {
                nC++;
            }
            if(FAM.seq[j].c[i]=='G')
            {
                nG++;
            }
            if(FAM.seq[j].c[i]=='T')
            {
                nT++;
            }
        }

        if((nA==nC) || (nA==nG) || (nA==nT))
        {
            cons.c[i]='.';
        }
        else
        {
            if((nA>nC) && (nA>nG) && (nA>nT))
            {
                cons.c[i]='A';
            }
            if((nC>nA) && (nC>nG) && (nC>nT))
            {
                cons.c[i]='C';
            }
            if((nG>nA) && (nG>nC) && (nG>nT))
            {
                cons.c[i]='G';
            }
            if((nT>nA) && (nT>nC) && (nT>nG))
            {
                cons.c[i]='T';
            }
        }
    }

    cons.lenght=maxlenght;
    cons.ispartfam=true;

    return cons;
}

Проблема: С этим кодом консенсусные последовательности состоят только из 'A' и '.'. Например, если семейство содержит:

TCCTATGGAATCTTTTTA

TTCTATGGAATCTTTTTA

Консенсусная последовательность будет:

.... A ... AA ....... A

Функция записывает '.' когда нет 2-х раз, и он пишет «А» в противном случае. Строка, где это терпит неудачу, вероятно, если ((nA == n C) || (nA == nG) || (nA == nT)), так как если я сравню с n C, консенсусное семейство будет только содержать 'C' и '.'.

РЕДАКТИРОВАТЬ: ниже вы найдете минимальный репродуктивный пример. Я не мог быть более минимальным, чем это, оставаясь чистым.

1 Ответ

0 голосов
/ 07 января 2020

Я согласен, что проблемная строка c равна

       if((nA==nC) || (nA==nG) || (nA==nT))

Я думаю, что идея этого логика c заключается в том, что вам нужен уникальный максимальный базовый счет в данной позиции, чтобы сообщить консенсус, поэтому связи должны быть отклонены. К сожалению, идея ошибочно реализована как , так и .

Она ошибочна, потому что связи не имеют значения в целом , а, скорее, только когда есть ie для максимум рассчитывать в данной позиции. В частности, обратите внимание, что если каждая база в данной позиции является A, то ни одно из этих условий не выполняется, но если каждая база является какой-либо из других, то две из них обе будут иметь значение true в форме 0 == 0.

Это неправильно реализовано, потому что вы не тестируете все пары. Существует шесть различных способов формирования пар из набора из четырех различных элементов, но вы предоставили только три. Недостающие будут nC==nG, nC==nT и nG==nT. Если бы вы включили и их, то ваш вывод состоял бы только из «.», Но вы упустили именно те, которые позволили бы достичь консенсуса А.

Что еще хуже, этот конкретный бит бессмысленны . Вам не нужно предварительно проверять связи, потому что часть, которая пытается идентифицировать уникальный максимум, все равно исключит связи (для максимума). Вместо предварительной проверки на наличие связей, более эффективный подход просто установит «.» как запасной вариант, когда не выполняется ни одно из реальных условий консенсуса. Есть несколько способов сделать это, например:

            # Skip the explicit tie-checking altogether, and just do this ...
            if ((nA > nC) && (nA > nG) && (nA > nT)) {
                cons.c[i] = 'A';
            } else if ((nC > nA) && (nC > nG) && (nC > nT)) {
                cons.c[i] = 'C';
            } else if ((nG > nA) && (nG > nC) && (nG > nT)) {
                cons.c[i] = 'G';
            } else if ((nT > nA) && (nT > nC) && (nT > nG)) {
                cons.c[i] = 'T';
            } else {
                cons.c[i] = '.';
            }
...