2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
\r
3 * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Software
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
19 package jalview.datamodel;
\r
21 import java.util.Enumeration;
\r
22 import java.util.Vector;
\r
24 import jalview.util.MapList;
\r
27 * Stores mapping between the columns of a protein alignment and a DNA alignment
\r
28 * and a list of individual codon to amino acid mappings between sequences.
\r
31 public class AlignedCodonFrame
\r
34 * array of nucleotide positions for aligned codons at column of aligned proteins.
\r
36 public int[][] codons = null;
\r
38 * width of protein sequence alignement
\r
39 * implicit assertion that codons.length >= aaWidth
\r
41 public int aaWidth=0;
\r
43 * initialise codon frame with a nominal alignment width
\r
46 public AlignedCodonFrame(int aWidth)
\r
53 codons = new int[aWidth][];
\r
54 for (int res = 0; res < aWidth; res++)
\r
59 * ensure that codons array is at least as wide as aslen residues
\r
61 * @return (possibly newly expanded) codon array
\r
63 public int[][] checkCodonFrameWidth(int aslen)
\r
65 if (codons.length <= aslen + 1)
\r
67 // probably never have to do this ?
\r
68 int[][] c = new int[codons.length + 10][];
\r
69 for (int i = 0; i < codons.length; i++)
\r
79 * @return width of aligned translated amino acid residues
\r
81 public int getaaWidth()
\r
86 * TODO: not an ideal solution - we reference the aligned amino acid sequences in order to make insertions on them
\r
87 * Better would be dnaAlignment and aaAlignment reference....
\r
89 Vector a_aaSeqs=new Vector();
\r
91 * increase aaWidth by one and insert a new aligned codon position space at aspos.
\r
94 public void insertAAGap(int aspos, char gapCharacter)
\r
96 // this aa appears before the aligned codons at aspos - so shift them in each pair of mapped sequences
\r
100 // we actually have to modify the aligned sequences here, so use the a_aaSeqs vector
\r
101 Enumeration sq = a_aaSeqs.elements();
\r
102 while (sq.hasMoreElements())
\r
104 ((SequenceI) sq.nextElement()).insertCharAt(aspos, gapCharacter);
\r
107 checkCodonFrameWidth(aspos);
\r
111 System.arraycopy(codons, aspos, codons, aspos+1, aaWidth-aspos);
\r
112 codons[aspos]=null; // clear so new codon position can be marked.
\r
116 public void setAaWidth(int aapos)
\r
121 * tied array of na Sequence objects.
\r
123 SequenceI[] dnaSeqs=null;
\r
125 * tied array of Mappings to protein sequence Objects and
\r
126 SequenceI[] aaSeqs=null;
\r
127 * MapLists where eac maps from the corresponding dnaSeqs element to corresponding aaSeqs element
\r
129 Mapping[] dnaToProt=null;
\r
131 * add a mapping between the dataset sequences for the associated dna and protein sequence objects
\r
136 public void addMap(SequenceI dnaseq, SequenceI aaseq, MapList map)
\r
141 nlen = dnaSeqs.length+1;
\r
143 SequenceI[] ndna = new SequenceI[nlen];
\r
144 Mapping[] ndtp = new Mapping[nlen];
\r
147 System.arraycopy(dnaSeqs,0,ndna, 0, dnaSeqs.length);
\r
148 System.arraycopy(dnaToProt,0,ndtp, 0, dnaSeqs.length);
\r
153 dnaSeqs[nlen] = (dnaseq.getDatasetSequence()==null) ? dnaseq : dnaseq.getDatasetSequence();
\r
154 Mapping mp = new Mapping(map);
\r
155 // JBPNote DEBUG! THIS !
\r
156 //dnaseq.transferAnnotation(aaseq, mp);
\r
157 //aaseq.transferAnnotation(dnaseq, new Mapping(map.getInverse()));
\r
158 mp.to = (aaseq.getDatasetSequence()==null) ? aaseq : aaseq.getDatasetSequence();
\r
159 a_aaSeqs.addElement(aaseq);
\r
160 dnaToProt[nlen] = mp;
\r
164 public SequenceI[] getdnaSeqs()
\r
168 public SequenceI[] getAaSeqs()
\r
170 if (dnaToProt==null)
\r
172 SequenceI[] sqs = new SequenceI[dnaToProt.length];
\r
173 for (int sz=0; sz<dnaToProt.length; sz++)
\r
175 sqs[sz] = dnaToProt[sz].to;
\r
179 public MapList[] getdnaToProt()
\r
181 if (dnaToProt==null)
\r
183 MapList[] sqs = new MapList[dnaToProt.length];
\r
184 for (int sz=0; sz<dnaToProt.length; sz++)
\r
186 sqs[sz] = dnaToProt[sz].map;
\r
190 public Mapping[] getProtMappings()
\r
196 * @param sequenceRef
\r
197 * @return null or corresponding aaSeq entry for dnaSeq entry
\r
199 public SequenceI getAaForDnaSeq(SequenceI dnaSeqRef)
\r
205 SequenceI dnads = dnaSeqRef.getDatasetSequence();
\r
206 for (int ds=0;ds<dnaSeqs.length; ds++)
\r
208 if (dnaSeqs[ds]==dnaSeqRef || dnaSeqs[ds]==dnads)
\r
209 return dnaToProt[ds].to;
\r
215 * @param sequenceRef
\r
216 * @return null or corresponding aaSeq entry for dnaSeq entry
\r
218 public SequenceI getDnaForAaSeq(SequenceI aaSeqRef)
\r
220 if (dnaToProt==null)
\r
224 SequenceI aads = aaSeqRef.getDatasetSequence();
\r
225 for (int as=0;as<dnaToProt.length; as++)
\r
227 if (dnaToProt[as].to==aaSeqRef || dnaToProt[as].to==aads)
\r
228 return dnaSeqs[as];
\r
233 * test to see if codon frame involves seq in any way
\r
234 * @param seq a nucleotide or protein sequence
\r
235 * @return true if a mapping exists to or from this sequence to any translated sequence
\r
237 public boolean involvesSequence(SequenceI seq)
\r
239 return getAaForDnaSeq(seq)!=null || getDnaForAaSeq(seq)!=null;
\r
242 * Add search results for regions in other sequences that translate or are translated from a particular position in seq
\r
244 * @param index position in seq
\r
245 * @param results where highlighted regions go
\r
247 public void markMappedRegion(SequenceI seq, int index, SearchResults results)
\r
249 if (dnaToProt==null)
\r
254 SequenceI ds = seq.getDatasetSequence();
\r
255 for (int mi = 0; mi<dnaToProt.length; mi++)
\r
257 if (dnaSeqs[mi]==seq || dnaSeqs[mi]==ds)
\r
259 // DEBUG System.err.println("dna pos "+index);
\r
260 codon = dnaToProt[mi].map.locateInTo(index,index);
\r
263 for (int i=0; i<codon.length; i+=2)
\r
265 results.addResult(dnaToProt[mi].to, codon[i], codon[i+1]);
\r
269 if (dnaToProt[mi].to==seq || dnaToProt[mi].to==ds)
\r
271 // DEBUG System.err.println("aa pos "+index);
\r
273 codon = dnaToProt[mi].map.locateInFrom(index, index);
\r
276 for (int i=0; i<codon.length; i+=2)
\r
278 results.addResult(dnaSeqs[mi], codon[i], codon[i+1]);
\r