Я согласен, что проблемная строка 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] = '.';
}