2015-12-26 6 views
0

Я пытаюсь отладить мою программу для ошибок; например, когда я пытаюсь запустить свой код, он печатает только строку ДНК вместо того, чтобы печатать последовательности генов. Проблемная область находится вокруг инструкции while метода printAll. Мне нужно вызвать метод findStopIndex внутри цикла while. Но мне интересно, почему, когда я его запускаю, я выгляжу пустым. Любые идеи были бы весьма полезны.Отладка моего сбойного кода

public class FindMultiGenes4 { 
public 
int 
findStopIndex(String dna, int index){ 
    int stop1 = dna.indexOf("tga", index); 
    if (stop1 == -1 || (stop1-index) % 3 != 0){ 
     stop1 = dna.length(); 
     } 
     int stop2 = dna.indexOf("taa", index); 
     if (stop2 == -1 || (stop2-index) % 3 != 0){ 
      stop2 = dna.length(); 
     } 
     int stop3 = dna.indexOf("tag", index); 
     if (stop3 == -1 || (stop3-index) % 3 != 0){ 
      stop3 = dna.length(); 
     } 
     return Math.min(stop1, Math.min(stop2,stop3)); 
} 
    public void printAll(String dna) { 

    dna = "CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCCA"; 
    String sequence = dna.toLowerCase(); 
    int index = 0; 
    int newIndex = 0; 



    while (true) { 
     index = sequence.indexOf("atg", index); 
     if (index == -1) 
      break; 
     if (newIndex == -1) // Check needed only if a stop codon is not guaranteed for each start codon. 
      break; 
     int stop = findStopIndex(dna, index); 
     if (stop != sequence.length()){ 
      System.out.println("From " + (index ) + " to " + newIndex+3 + " Gene: " + sequence.substring(index, stop+3)); 
      index = sequence.substring(index, stop + 3).length(); 
     } 
     else {index = index+3; 
     } 





    } 
} 
public void testFinder(){ 


     FindMultiGenes4 FMG = new FindMultiGenes4(); 

     String dna = "CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCCA"; 

     FMG.printAll(dna); 




      System.out.println("DNA: "+dna); 
     } 
} 

ответ

0

Проблема была на линии ниже

int stop = findStopIndex(dna, index); 

dna является верхней строкой случая, когда в качестве findStopIndex проверки для строчных последовательностей генов tga, taa, tag.

Есть некоторые другие незначительные проблемы с кодом, который я надеюсь, скорректировал см модифицированного код ниже

public class FindMultiGenes4 { 
    private static final String GENE_PREFIX = "ATG"; 
    private static final String[] GENE_SUFFIXES = {"TGA", "TAA", "TAG"}; 

    public int findStopIndex(String dna, int index) { 
     int minStop = dna.length(); 
     for(String suffix : GENE_SUFFIXES) { 
      int stop = -1; 
      int localIndex = index; 
      do{//repeating if the match found is not multiple of 3 
       stop = dna.indexOf(suffix, localIndex); 
       if(stop == -1) { 
        stop = dna.length(); 
        break; 
       } 
       localIndex = stop + 3; 
      } while((stop - index) % 3 != 0); 

      if(minStop > stop) { 
       minStop = stop; 
      } 
     } 
     return minStop + 3; 
    } 

    public void printAll(String dna) { 
     String localDna = dna.toUpperCase(); 
     int index = 0; 
     while(index != -1 && index + 3 < localDna.length()) { 
      index = localDna.indexOf(GENE_PREFIX, index); 
      if(index == -1) { 
       break; 
      } 
      int stop = findStopIndex(localDna, index + 3); 
      if(stop < dna.length()) { 
       System.out.println("From " + (index) + " to " + stop 
         + " Gene: " + dna.substring(index, stop)); 
      } 
      index = stop; 
     } 
    } 

    public static void main(String[] args) { 

     FindMultiGenes4 FMG = new FindMultiGenes4(); 

     String[] dnaSamples = {"CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCCA", 
       "catgtaatagatgaatgactgatagatatgcttgtatgctatgaaaatgtgaaatgaccca", 
       "cAtGtAaTaGaTgAaTgAcTgAtAgAtAtGcTtGtAtGcTaTgAaAaTgTgAaAtGaCcCa", 
       "ATGAAATGAAAA", 
       "ccatgccctaataaatgtctgtaatgtaga"}; 

     for(String dna : dnaSamples) { 
      System.out.println("DNA: " + dna); 
      FMG.printAll(dna); 
      System.out.println(""); 
     } 
    } 
} 

Выхода

DNA: CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCCA 
From 1 to 7 Gene: ATGTAA 
From 10 to 22 Gene: ATGAATGACTGA 
From 27 to 57 Gene: ATGCTTGTATGCTATGAAAATGTGAAATGA 

DNA: catgtaatagatgaatgactgatagatatgcttgtatgctatgaaaatgtgaaatgaccca 
From 1 to 7 Gene: atgtaa 
From 10 to 22 Gene: atgaatgactga 
From 27 to 57 Gene: atgcttgtatgctatgaaaatgtgaaatga 

DNA: cAtGtAaTaGaTgAaTgAcTgAtAgAtAtGcTtGtAtGcTaTgAaAaTgTgAaAtGaCcCa 
From 1 to 7 Gene: AtGtAa 
From 10 to 22 Gene: aTgAaTgAcTgA 
From 27 to 57 Gene: AtGcTtGtAtGcTaTgAaAaTgTgAaAtGa 

DNA: ATGAAATGAAAA 
From 0 to 9 Gene: ATGAAATGA 

DNA: ccatgccctaataaatgtctgtaatgtaga 
From 2 to 11 Gene: atgccctaa 
From 14 to 29 Gene: atgtctgtaatgtag 

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

Использование регулярных выражений

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class FindMultiGenes5 { 
    /*(?i) : Case insensitive match 
    * ATG : Starts with ATG 
    * (\\w{3})*? : smallest string with length multiple of 3 
    * (TGA|TAA|TAG) : one of TAG, TAA or TAG 
    */ 
    private static final String GENE_REGEX = "(?i)ATG(\\w{3})*?(TGA|TAA|TAG)"; 

    public void regexMatch(String dna) { 
     Matcher matcher = Pattern.compile(GENE_REGEX).matcher(dna); 
     while(matcher.find()) { 
      System.out.println("From " + matcher.start() + " to " + matcher.end() + " Gene: " + matcher.group()); 
     } 
    } 

    public static void main(String[] args) { 

     FindMultiGenes5 FMG = new FindMultiGenes5(); 

     String[] dnaSamples = {"CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCCA", 
       "catgtaatagatgaatgactgatagatatgcttgtatgctatgaaaatgtgaaatgaccca", 
       "cAtGtAaTaGaTgAaTgAcTgAtAgAtAtGcTtGtAtGcTaTgAaAaTgTgAaAtGaCcCa", 
       "ATGAAATGAAAA", 
       "ccatgccctaataaatgtctgtaatgtaga"}; 
     /*String[] dnaSamples = {"ATGaaabbbATGTGATAATGA".toLowerCase()};*/ 

     for(String dna : dnaSamples) { 
      System.out.println("DNA: " + dna); 
      FMG.regexMatch(dna); 
      System.out.println(""); 
     } 
    } 
} 

Regular Expression Выход

DNA: CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCCA 
From 1 to 7 Gene: ATGTAA 
From 10 to 22 Gene: ATGAATGACTGA 
From 27 to 57 Gene: ATGCTTGTATGCTATGAAAATGTGAAATGA 

DNA: catgtaatagatgaatgactgatagatatgcttgtatgctatgaaaatgtgaaatgaccca 
From 1 to 7 Gene: atgtaa 
From 10 to 22 Gene: atgaatgactga 
From 27 to 57 Gene: atgcttgtatgctatgaaaatgtgaaatga 

DNA: cAtGtAaTaGaTgAaTgAcTgAtAgAtAtGcTtGtAtGcTaTgAaAaTgTgAaAtGaCcCa 
From 1 to 7 Gene: AtGtAa 
From 10 to 22 Gene: aTgAaTgAcTgA 
From 27 to 57 Gene: AtGcTtGtAtGcTaTgAaAaTgTgAaAtGa 

DNA: ATGAAATGAAAA 
From 0 to 9 Gene: ATGAAATGA 

DNA: ccatgccctaataaatgtctgtaatgtaga 
From 2 to 11 Gene: atgccctaa 
From 14 to 29 Gene: atgtctgtaatgtag 
+0

Но что, если у меня есть строка ДНК, которая является строчной. Что мне нужно сделать, чтобы изменить этот код? –

+0

Я отредактировал свой ответ, теперь он нечувствителен к регистру. – 11thdimension

+0

Программа имеет один недостаток: она не смотрит мимо предыдущих генов. Вместо этого он находит перекрывающиеся гены. В случае с dna strand ATGAAATGAAAA он не обнаруживает генов. Вот некоторые примеры нити, где гены выходных показаны, а также: Строка ДНК: ATGAAATGAAAA Джин найденное: ATGAAATGA Строка ДНК: ccatgccctaataaatgtctgtaatgtaga Гены найдены являются: atgccctaa atgtctgtaatgtag –

0

Хорошо, Вы/еще есть несколько проблем. Я не могу помочь слишком сильно, так как не знаю конечной цели. Я не знаю правил вокруг вашего алгоритма.

Я тем не менее сделать несколько вещей, и в конечном итоге, кажется, работает: Во-первых, последовательность должна быть отправлена ​​в качестве параметра, а не днк, в строке:

int stop = findStopIndex(dna, index); 

становится

int stop = findStopIndex(sequence, index); 

Затем вы заметите, что переменная newIndex не делает ничего. Значение всегда остается 0. Кроме того, проверка на -1 поэтому не имеет значения. Я изменил значение на вашем выходе на (stop + 3). Также обратите внимание на скобки. Без него он будет интерпретироваться как строка.

Другие незначительные улучшения включают хорошие добавляя свои значения в качестве переменных вместо жесткого кодирования их:

private final String[] STOP_SEQUENCES = {"tga", "taa", "tag"}; 
private final String START_SEQ = "atg"; 

И как общее правило, стараются избегать повторения кода. В коде findStopIndex(String dna, int index) вы повторяете переменную 3 раза. Это хорошо и все, пока не будет больше переменных. Что такое 50 000 стоп-кодов?

Метод может поэтому быть разделен и сделал более общее:

public int findStopIndex(String dna, int index) { 
    int minStop = dna.length(); 
    int prevStop = dna.length(); 
    for (String stopSeq : STOP_SEQUENCES) { 
     int stop = dna.indexOf(stopSeq, index); 
     if (!hasStop(stop, index)) { 
      stop = dna.length(); 
     } 
     int tempMinStop = Math.min(stop, prevStop); 
     minStop = minStop > tempMinStop ? tempMinStop : minStop; 
     prevStop = stop; 
    } 
    return minStop; 
} 

public boolean hasStop(int stop, int index) { 
    if (stop == -1 || (stop - index) % 3 != 0) { 
     return false; 
    } 
    return true; 
} 

И printAll(String dna) метод:

public void printAll(String dna) { 
    String sequence = dna.toLowerCase(); 
    int index = 0; 
    while (true) { 
     index = sequence.indexOf(START_SEQ, index); 
     if (index == -1) { 
      break; 
     } 
     int stop = findStopIndex(sequence, index); 
     if (stop != sequence.length()) { 
      System.out.println("From " + (index) + " to " + (stop + 3) + " Gene: " + sequence.substring(index, stop + 3)); 
      index = stop; 
     } else { 
      index = index + 3; 
     } 
    } 
} 

Пожалуйста, обратите внимание на изменения сделаны:

index = sequence.substring(index, stop + 3).length(); 

является в настоящее время

index = stop; 

, чтобы избежать бесконечного цикла.


Все это легко отлаживается с помощью встроенных средств отладки. В надлежащей Java IDE должен быть отладчик. для получения дополнительной информации, пожалуйста, смотрите отладку с IDE, , например, вот как отлаживать с помощью Netbeans: Netbeans Debugging

А вот один на Eclipse: Eclipse Debugging

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

+0

Конечной целью было бы иметь гены, начинающиеся с ATG и заканчивающиеся TAA, TGA или TAG, распечатанные, если один из генов кратен 3. Если не кратно 3, программа должна пропустить, чтобы искать другой конец кодона с т. е. TAG и т. д. Если найдено несколько генов, выберите самый маленький и распечатайте это. Если не обнаружен кодон запуска ATG, прекратите программу. Для получения дополнительной информации об алгоритме см. Http://stackoverflow.com/questions/34459060/java-program-malfunction –