X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FDna.java;h=b639e36b4f53f45ed473890ec54ea33319871f2f;hb=b13f521553582ef2fbfd7815ae25e23284babdea;hp=f0041f697d3eb98aeefb7bbd9e8c1906b51a49ee;hpb=a2207bf3ccb22ccd26719724bb9de964ddf24dce;p=jalview.git diff --git a/src/jalview/analysis/Dna.java b/src/jalview/analysis/Dna.java index f0041f6..b639e36 100644 --- a/src/jalview/analysis/Dna.java +++ b/src/jalview/analysis/Dna.java @@ -1,26 +1,25 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8) - * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2) + * Copyright (C) 2014 The Jalview Authors * * 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. + * 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 . + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.analysis; -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.Vector; - import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; @@ -36,6 +35,10 @@ import jalview.schemes.ResidueProperties; import jalview.util.MapList; import jalview.util.ShiftList; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.Vector; + public class Dna { /** @@ -49,9 +52,13 @@ public class Dna { if (cdp2 == null || (cdp1[0] == cdp2[0] && cdp1[1] == cdp2[1] && cdp1[2] == cdp2[2])) + { return 0; + } if (cdp1[0] < cdp2[0] || cdp1[1] < cdp2[1] || cdp1[2] < cdp2[2]) + { return -1; // one base in cdp1 precedes the corresponding base in the + } // other codon return 1; // one base in cdp1 appears after the corresponding base in the // other codon. @@ -125,21 +132,27 @@ public class Dna { SequenceI newseq = translateCodingRegion(selection[s], seqstring[s], viscontigs, codons, gapCharacter, - (product != null) ? product[s] : null); // possibly anonymous + (product != null) ? product[s] : null, false); // possibly + // anonymous // product if (newseq != null) { pepseqs.addElement(newseq); SequenceI ds = newseq; - while (ds.getDatasetSequence() != null) + if (dataset != null) { - ds = ds.getDatasetSequence(); + while (ds.getDatasetSequence() != null) + { + ds = ds.getDatasetSequence(); + } + dataset.addSequence(ds); } - dataset.addSequence(ds); } } if (codons.aaWidth == 0) + { return null; + } SequenceI[] newseqs = new SequenceI[pepseqs.size()]; pepseqs.copyInto(newseqs); AlignmentI al = new Alignment(newseqs); @@ -257,7 +270,9 @@ public class Dna // generate seqstring for this sequence based on mapping if (sqstr.length() > alwidth) + { alwidth = sqstr.length(); + } cdnasqs.addElement(sqstr.toString()); cdnasqi.addElement(dna); cdnaprod.addElement(intersect); @@ -400,7 +415,7 @@ public class Dna } if (contrib > 1) { - annot.value /= (float) contrib; + annot.value /= contrib; } return annot; } @@ -417,13 +432,40 @@ public class Dna * @param codons * Definition of global ORF alignment reference frame * @param gapCharacter - * @param newSeq * @return sequence ready to be added to alignment. + * @deprecated Use + * {@link #translateCodingRegion(SequenceI,String,int[],AlignedCodonFrame,char,DBRefEntry,boolean)} + * instead */ + @Deprecated public static SequenceI translateCodingRegion(SequenceI selection, String seqstring, int[] viscontigs, AlignedCodonFrame codons, char gapCharacter, DBRefEntry product) { + return translateCodingRegion(selection, seqstring, viscontigs, codons, + gapCharacter, product, false); + } + + /** + * 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 gapCharacter + * @param starForStop + * when true stop codons will translate as '*', otherwise as 'X' + * @return sequence ready to be added to alignment. + */ + public static SequenceI translateCodingRegion(SequenceI selection, + String seqstring, int[] viscontigs, AlignedCodonFrame codons, + char gapCharacter, DBRefEntry product, final boolean starForStop) + { java.util.List skip = new ArrayList(); int skipint[] = null; ShiftList vismapping = new ShiftList(); // map from viscontigs to seqstring @@ -480,23 +522,84 @@ public class Dna // edit scontigs skipint[0] = vismapping.shift(skipint[0]); skipint[1] = vismapping.shift(skipint[1]); - for (vc = 0; vc < scontigs.length; vc += 2) + for (vc = 0; vc < scontigs.length;) { if (scontigs[vc + 1] < skipint[0]) { + // before skipint starts + vc += 2; continue; } + if (scontigs[vc] > skipint[1]) + { + // finished editing so + break; + } + // Edit the contig list to include the skipped region which did + // not translate + int[] t; + // from : s1 e1 s2 e2 s3 e3 + // to s: s1 e1 s2 k0 k1 e2 s3 e3 + // list increases by one unless one boundary (s2==k0 or e2==k1) + // matches, and decreases by one if skipint intersects whole + // visible contig if (scontigs[vc] <= skipint[0]) { if (skipint[0] == scontigs[vc]) { - + // skipint at start of contig + // shift the start of this contig + if (scontigs[vc + 1] > skipint[1]) + { + scontigs[vc] = skipint[1]; + vc += 2; + } + else + { + if (scontigs[vc + 1] == skipint[1]) + { + // remove the contig + t = new int[scontigs.length - 2]; + if (vc > 0) + { + System.arraycopy(scontigs, 0, t, 0, vc - 1); + } + if (vc + 2 < t.length) + { + System.arraycopy(scontigs, vc + 2, t, vc, t.length + - vc + 2); + } + scontigs = t; + } + else + { + // truncate contig to before the skipint region + scontigs[vc + 1] = skipint[0] - 1; + vc += 2; + } + } } else { - int[] t = new int[scontigs.length + 2]; - System.arraycopy(scontigs, 0, t, 0, vc - 1); - // scontigs[vc]; // + // scontig starts before start of skipint + if (scontigs[vc + 1] < skipint[1]) + { + // skipint truncates end of scontig + scontigs[vc + 1] = skipint[0] - 1; + vc += 2; + } + else + { + // divide region to new contigs + t = new int[scontigs.length + 2]; + System.arraycopy(scontigs, 0, t, 0, vc + 1); + t[vc + 1] = skipint[0]; + t[vc + 2] = skipint[1]; + System.arraycopy(scontigs, vc + 1, t, vc + 3, + scontigs.length - (vc + 1)); + scontigs = t; + vc += 4; + } } } } @@ -505,7 +608,7 @@ public class Dna } if (aa.equals("STOP")) { - aa = "X"; + aa = starForStop ? "*" : "X"; } resSize++; } @@ -562,8 +665,16 @@ public class Dna protein.toString()); if (rf != 0) { - jalview.bin.Cache.log - .debug("trimming contigs for incomplete terminal codon."); + if (jalview.bin.Cache.log != null) + { + jalview.bin.Cache.log + .debug("trimming contigs for incomplete terminal codon."); + } + else + { + System.err + .println("trimming contigs for incomplete terminal codon."); + } // map and trim contigs to ORF region vc = scontigs.length - 1; lastnpos = vismapping.shift(lastnpos); // place npos in context of @@ -592,7 +703,9 @@ public class Dna scontigs = t; } if (vc <= 0) + { scontigs = null; + } } if (scontigs != null) { @@ -603,7 +716,9 @@ public class Dna scontigs[vc] = selection.findPosition(scontigs[vc]); // not from 1! scontigs[vc + 1] = selection.findPosition(scontigs[vc + 1]); // exclusive if (scontigs[vc + 1] == selection.getEnd()) + { break; + } } // trim trailing empty intervals. if ((vc + 2) < scontigs.length) @@ -676,7 +791,7 @@ public class Dna private static void transferCodedFeatures(SequenceI dna, SequenceI pep, MapList map, Hashtable featureTypes, Hashtable featureGroups) { - SequenceFeature[] sf = dna.getDatasetSequence().getSequenceFeatures(); + SequenceFeature[] sf = dna.getSequenceFeatures(); Boolean fgstate; jalview.datamodel.DBRefEntry[] dnarefs = jalview.util.DBRefUtils .selectRefs(dna.getDBRef(),