X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fanalysis%2FDna.java;h=2ad8487bcdec37ef0e84d4e83d68f1e573663155;hb=b2a2c2070f14d18d67b07b030d70073a21b7a4e3;hp=a6fe541598371489d89f45ada1014af7a4b40767;hpb=4c1ab51e2c08f85ba8c38486adf4a6ce0b0f25c3;p=jalview.git diff --git a/src/jalview/analysis/Dna.java b/src/jalview/analysis/Dna.java index a6fe541..2ad8487 100644 --- a/src/jalview/analysis/Dna.java +++ b/src/jalview/analysis/Dna.java @@ -71,6 +71,10 @@ public class Dna private final AlignmentI dataset; + private ShiftList vismapping; + + private int[] startcontigs; + /* * Working variables for the translation. * @@ -101,6 +105,45 @@ public class Dna this.annotations = viewport.getAlignment().getAlignmentAnnotation(); this.dnaWidth = viewport.getAlignment().getWidth(); this.dataset = viewport.getAlignment().getDataset(); + initContigs(); + } + + /** + * Initialise contigs used as starting point for translateCodingRegion + */ + private void initContigs() + { + vismapping = new ShiftList(); // map from viscontigs to seqstring + // intervals + + int npos = 0; + int[] lastregion = null; + ArrayList tempcontigs = new ArrayList<>(); + while (contigs.hasNext()) + { + int[] region = contigs.next(); + if (lastregion == null) + { + vismapping.addShift(npos, region[0]); + } + else + { + // hidden region + vismapping.addShift(npos, region[0] - lastregion[1] + 1); + } + lastregion = region; + tempcontigs.add(region[0]); + tempcontigs.add(region[1]); + } + + startcontigs = new int[tempcontigs.size()]; + int i = 0; + for (Integer val : tempcontigs) + { + startcontigs[i] = val; + i++; + } + tempcontigs = null; } /** @@ -393,38 +436,13 @@ public class Dna List proteinSeqs) { List skip = new ArrayList<>(); - int skipint[] = null; - ShiftList vismapping = new ShiftList(); // map from viscontigs to seqstring - // intervals - int vc = 0; + int[] skipint = null; int npos = 0; - int[] lastregion = null; - while (contigs.hasNext()) - { - int[] region = contigs.next(); - if (lastregion == null) - { - vismapping.addShift(npos, region[0]); - } - else - { - // hidden region - vismapping.addShift(npos, region[0] - lastregion[1] + 1); - } - lastregion = region; - vc++; - } + int vc = 0; - int[] scontigs = new int[vc]; - vc = 0; - while (contigs.hasNext()) - { - int[] region = contigs.next(); - scontigs[vc] = region[0]; - scontigs[vc + 1] = region[1]; - vc++; - } + int[] scontigs = new int[startcontigs.length]; + System.arraycopy(startcontigs, 0, scontigs, 0, startcontigs.length); // allocate a roughly sized buffer for the protein sequence StringBuilder protein = new StringBuilder(seqstring.length() / 2); @@ -557,7 +575,7 @@ public class Dna skip.add(skipint); skipint = null; } - if (aa.equals("STOP")) + if (aa.equals(ResidueProperties.STOP)) { aa = STOP_ASTERIX; } @@ -864,6 +882,23 @@ public class Dna } /** + * Answers the reverse complement of the input string + * + * @see #getComplement(char) + * @param s + * @return + */ + public static String reverseComplement(String s) + { + StringBuilder sb = new StringBuilder(s.length()); + for (int i = s.length() - 1; i >= 0; i--) + { + sb.append(Dna.getComplement(s.charAt(i))); + } + return sb.toString(); + } + + /** * Returns dna complement (preserving case) for aAcCgGtTuU. Ambiguity codes * are treated as on http://reverse-complement.com/. Anything else is left * unchanged.