X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FDna.java;h=482c54a8bdacf41999ab959535528f592059b994;hb=fbde107078519fa81deb66de1fb0f33939c96f35;hp=7bac46e2405e80683bcbd41db5965597c41cb2b2;hpb=330436f820ff05bff98de5528a01609d37955274;p=jalview.git
diff --git a/src/jalview/analysis/Dna.java b/src/jalview/analysis/Dna.java
index 7bac46e..482c54a 100644
--- a/src/jalview/analysis/Dna.java
+++ b/src/jalview/analysis/Dna.java
@@ -1,3 +1,20 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
+ * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with Jalview. If not, see .
+ */
package jalview.analysis;
import java.util.Enumeration;
@@ -66,7 +83,8 @@ public class Dna
* @param gapCharacter
* @param annotations
* @param aWidth
- * @param dataset destination dataset for translated sequences and mappings
+ * @param dataset
+ * destination dataset for translated sequences and mappings
* @return
*/
public static AlignmentI CdnaTranslate(SequenceI[] selection,
@@ -81,7 +99,9 @@ public class Dna
*
* @param selection
* @param seqstring
- * @param product - array of DbRefEntry objects from which exon map in seqstring is derived
+ * @param product
+ * - array of DbRefEntry objects from which exon map in seqstring is
+ * derived
* @param viscontigs
* @param gapCharacter
* @param annotations
@@ -91,7 +111,8 @@ public class Dna
*/
public static AlignmentI CdnaTranslate(SequenceI[] selection,
String[] seqstring, DBRefEntry[] product, int viscontigs[],
- char gapCharacter, AlignmentAnnotation[] annotations, int aWidth, Alignment dataset)
+ char gapCharacter, AlignmentAnnotation[] annotations, int aWidth,
+ Alignment dataset)
{
AlignedCodonFrame codons = new AlignedCodonFrame(aWidth); // stores hash of
// subsequent
@@ -104,12 +125,14 @@ public class Dna
for (s = 0; s < sSize; s++)
{
SequenceI newseq = translateCodingRegion(selection[s], seqstring[s],
- viscontigs, codons, gapCharacter, (product!=null) ? product[s] : null); // possibly anonymous product
+ viscontigs, codons, gapCharacter,
+ (product != null) ? product[s] : null); // possibly anonymous
+ // product
if (newseq != null)
{
pepseqs.addElement(newseq);
SequenceI ds = newseq;
- while (ds.getDatasetSequence()!=null)
+ while (ds.getDatasetSequence() != null)
{
ds = ds.getDatasetSequence();
}
@@ -127,31 +150,36 @@ public class Dna
al.addCodonFrame(codons);
return al;
}
+
/**
- * fake the collection of DbRefs with associated exon mappings to identify
- * if a translation would generate distinct product in the currently selected region.
+ * fake the collection of DbRefs with associated exon mappings to identify if
+ * a translation would generate distinct product in the currently selected
+ * region.
+ *
* @param selection
* @param viscontigs
* @return
*/
- public static boolean canTranslate(SequenceI[] selection, int viscontigs[])
+ public static boolean canTranslate(SequenceI[] selection,
+ int viscontigs[])
{
- for (int gd=0; gdalwidth)
+
+ if (sqstr.length() > alwidth)
alwidth = sqstr.length();
cdnasqs.addElement(sqstr.toString());
cdnasqi.addElement(dna);
@@ -237,7 +271,8 @@ public class Dna
cdnasqs.copyInto(xons);
cdnaprod.copyInto(prods);
cdnasqi.copyInto(cdna);
- return CdnaTranslate(cdna, xons, prods, viscontigs, gapCharacter, null, alwidth, dataset);
+ return CdnaTranslate(cdna, xons, prods, viscontigs, gapCharacter,
+ null, alwidth, dataset);
}
return null;
}
@@ -282,7 +317,8 @@ public class Dna
if (codons.codons[a] != null
&& codons.codons[a][0] == (codons.codons[a][2] - 2))
{
- anots[a] = getCodonAnnotation(codons.codons[a], annotations[i].annotations);
+ anots[a] = getCodonAnnotation(codons.codons[a],
+ annotations[i].annotations);
}
}
}
@@ -292,9 +328,10 @@ public class Dna
aa.graph = annotations[i].graph;
aa.graphGroup = annotations[i].graphGroup;
aa.graphHeight = annotations[i].graphHeight;
- if (annotations[i].getThreshold()!=null)
+ if (annotations[i].getThreshold() != null)
{
- aa.setThreshold(new jalview.datamodel.GraphLine(annotations[i].getThreshold()));
+ aa.setThreshold(new jalview.datamodel.GraphLine(annotations[i]
+ .getThreshold()));
}
if (annotations[i].hasScore)
{
@@ -321,27 +358,65 @@ public class Dna
}
}
- private static Annotation getCodonAnnotation(int[] is, Annotation[] annotations)
- {
+ private static Annotation getCodonAnnotation(int[] is,
+ Annotation[] annotations)
+ {
// Have a look at all the codon positions for annotation and put the first
// one found into the translated annotation pos.
- for (int p=0; p<3; p++)
+ int contrib = 0;
+ Annotation annot = null;
+ for (int p = 0; p < 3; p++)
{
- if (annotations[is[p]]!=null)
+ if (annotations[is[p]] != null)
{
- return new Annotation(annotations[is[p]]);
+ if (annot == null)
+ {
+ annot = new Annotation(annotations[is[p]]);
+ contrib = 1;
+ }
+ else
+ {
+ // merge with last
+ Annotation cpy = new Annotation(annotations[is[p]]);
+ if (annot.colour == null)
+ {
+ annot.colour = cpy.colour;
+ }
+ if (annot.description == null || annot.description.length() == 0)
+ {
+ annot.description = cpy.description;
+ }
+ if (annot.displayCharacter == null)
+ {
+ annot.displayCharacter = cpy.displayCharacter;
+ }
+ if (annot.secondaryStructure == 0)
+ {
+ annot.secondaryStructure = cpy.secondaryStructure;
+ }
+ annot.value += cpy.value;
+ contrib++;
+ }
}
}
- return null;
+ if (contrib > 1)
+ {
+ annot.value /= (float) contrib;
+ }
+ return annot;
}
/**
* Translate a na sequence
*
- * @param selection sequence displayed under viscontigs visible columns
- * @param seqstring ORF read in some global alignment reference frame
- * @param viscontigs mapping from global reference frame to visible seqstring ORF read
- * @param codons Definition of global ORF alignment reference frame
+ * @param selection
+ * sequence displayed under viscontigs visible columns
+ * @param seqstring
+ * ORF read in some global alignment reference frame
+ * @param viscontigs
+ * mapping from global reference frame to visible seqstring ORF read
+ * @param codons
+ * Definition of global ORF alignment reference frame
* @param gapCharacter
* @param newSeq
* @return sequence ready to be added to alignment.
@@ -350,16 +425,25 @@ public class Dna
String seqstring, int[] viscontigs, AlignedCodonFrame codons,
char gapCharacter, DBRefEntry product)
{
+ Vector skip = new Vector();
+ int skipint[] = null;
ShiftList vismapping = new ShiftList(); // map from viscontigs to seqstring
// intervals
int vc, scontigs[] = new int[viscontigs.length];
int npos = 0;
for (vc = 0; vc < viscontigs.length; vc += 2)
{
- vismapping.addShift(npos, viscontigs[vc]);
- scontigs[vc] = npos;
- npos += viscontigs[vc + 1];
- scontigs[vc + 1] = npos;
+ if (vc == 0)
+ {
+ vismapping.addShift(npos, viscontigs[vc]);
+ }
+ else
+ {
+ // hidden region
+ vismapping.addShift(npos, viscontigs[vc] - viscontigs[vc - 1] + 1);
+ }
+ scontigs[vc] = viscontigs[vc];
+ scontigs[vc + 1] = viscontigs[vc + 1];
}
StringBuffer protein = new StringBuffer();
@@ -381,9 +465,45 @@ public class Dna
String aa = ResidueProperties.codonTranslate(new String(codon));
rf = 0;
if (aa == null)
+ {
aa = String.valueOf(gapCharacter);
+ if (skipint == null)
+ {
+ skipint = new int[]
+ { cdp[0], cdp[2] };
+ }
+ skipint[1] = cdp[2];
+ }
else
{
+ if (skipint != null)
+ {
+ // edit scontigs
+ skipint[0] = vismapping.shift(skipint[0]);
+ skipint[1] = vismapping.shift(skipint[1]);
+ for (vc = 0; vc < scontigs.length; vc += 2)
+ {
+ if (scontigs[vc + 1] < skipint[0])
+ {
+ continue;
+ }
+ if (scontigs[vc] <= skipint[0])
+ {
+ if (skipint[0] == scontigs[vc])
+ {
+
+ }
+ else
+ {
+ int[] t = new int[scontigs.length + 2];
+ System.arraycopy(scontigs, 0, t, 0, vc - 1);
+ // scontigs[vc]; //
+ }
+ }
+ }
+ skip.addElement(skipint);
+ skipint = null;
+ }
if (aa.equals("STOP"))
{
aa = "X";
@@ -409,8 +529,8 @@ public class Dna
// with a gap
aa = "" + gapCharacter + aa;
aspos++;
- //if (aspos >= codons.aaWidth)
- // codons.aaWidth = aspos + 1;
+ // if (aspos >= codons.aaWidth)
+ // codons.aaWidth = aspos + 1;
break; // check the next position for alignment
case 0:
// codon aligns at aspos position.
@@ -426,15 +546,21 @@ public class Dna
codons.codons[aspos] = new int[]
{ cdp[0], cdp[1], cdp[2] };
}
- aspos++;
if (aspos >= codons.aaWidth)
- codons.aaWidth = aspos + 1;
+ {
+ // update maximum alignment width
+ // (we can do this without calling checkCodonFrameWidth because it was
+ // already done above)
+ codons.setAaWidth(aspos);
+ }
+ // ready for next translated reading frame alignment position (if any)
+ aspos++;
}
}
if (resSize > 0)
{
- SequenceI newseq = new Sequence(selection.getName(), protein
- .toString());
+ SequenceI newseq = new Sequence(selection.getName(),
+ protein.toString());
if (rf != 0)
{
jalview.bin.Cache.log
@@ -472,14 +598,11 @@ public class Dna
if (scontigs != null)
{
npos = 0;
- // Find sequence position for scontigs positions on the nucleotide
- // sequence string we were passed.
- for (vc = 0; vc < viscontigs.length; vc += 2)
+ // map scontigs to actual sequence positions on selection
+ for (vc = 0; vc < scontigs.length; vc += 2)
{
scontigs[vc] = selection.findPosition(scontigs[vc]); // not from 1!
- npos += viscontigs[vc];
- scontigs[vc + 1] = selection
- .findPosition(npos + scontigs[vc + 1]); // exclusive
+ scontigs[vc + 1] = selection.findPosition(scontigs[vc + 1]); // exclusive
if (scontigs[vc + 1] == selection.getEnd())
break;
}
@@ -490,20 +613,35 @@ public class Dna
System.arraycopy(scontigs, 0, t, 0, vc + 2);
scontigs = t;
}
+ /*
+ * delete intervals in scontigs which are not translated. 1. map skip
+ * into sequence position intervals 2. truncate existing ranges and add
+ * new ranges to exclude untranslated regions. if (skip.size()>0) {
+ * Vector narange = new Vector(); for (vc=0; vc=skipint[0] &&
+ * iv[0]<=skipint[1]) { if (iv[0]==skipint[0]) { // delete beginning of
+ * range } else { // truncate range and create new one if necessary iv =
+ * (int[]) narange.elementAt(vc+1); if (iv[0]<=skipint[1]) { // truncate
+ * range iv[0] = skipint[1]; } else { } } } else if (iv[0]