1 package jalview.datamodel;
\r
3 import java.util.Enumeration;
\r
4 import java.util.Vector;
\r
6 import jalview.util.MapList;
\r
9 * Stores mapping between the columns of a protein alignment and a DNA alignment
\r
10 * and a list of individual codon to amino acid mappings between sequences.
\r
13 public class AlignedCodonFrame
\r
16 * array of nucleotide positions for aligned codons at column of aligned proteins.
\r
18 public int[][] codons = null;
\r
20 * width of protein sequence alignement
\r
21 * implicit assertion that codons.length >= aaWidth
\r
23 public int aaWidth=0;
\r
25 * initialise codon frame with a nominal alignment width
\r
28 public AlignedCodonFrame(int aWidth)
\r
35 codons = new int[aWidth][];
\r
36 for (int res = 0; res < aWidth; res++)
\r
41 * ensure that codons array is at least as wide as aslen residues
\r
43 * @return (possibly newly expanded) codon array
\r
45 public int[][] checkCodonFrameWidth(int aslen)
\r
47 if (codons.length <= aslen + 1)
\r
49 // probably never have to do this ?
\r
50 int[][] c = new int[codons.length + 10][];
\r
51 for (int i = 0; i < codons.length; i++)
\r
61 * @return width of aligned translated amino acid residues
\r
63 public int getaaWidth()
\r
68 * TODO: not an ideal solution - we reference the aligned amino acid sequences in order to make insertions on them
\r
69 * Better would be dnaAlignment and aaAlignment reference....
\r
71 Vector a_aaSeqs=new Vector();
\r
73 * increase aaWidth by one and insert a new aligned codon position space at aspos.
\r
76 public void insertAAGap(int aspos, char gapCharacter)
\r
78 // this aa appears before the aligned codons at aspos - so shift them in each pair of mapped sequences
\r
82 // we actually have to modify the aligned sequences here, so use the a_aaSeqs vector
\r
83 Enumeration sq = a_aaSeqs.elements();
\r
84 while (sq.hasMoreElements())
\r
86 ((SequenceI) sq.nextElement()).insertCharAt(aspos, gapCharacter);
\r
89 checkCodonFrameWidth(aspos);
\r
93 System.arraycopy(codons, aspos, codons, aspos+1, aaWidth-aspos);
\r
94 codons[aspos]=null; // clear so new codon position can be marked.
\r
98 public void setAaWidth(int aapos)
\r
103 * tied array of na Sequence objects.
\r
105 SequenceI[] dnaSeqs=null;
\r
107 * tied array of Mappings to protein sequence Objects and
\r
108 SequenceI[] aaSeqs=null;
\r
109 * MapLists where eac maps from the corresponding dnaSeqs element to corresponding aaSeqs element
\r
111 Mapping[] dnaToProt=null;
\r
113 * add a mapping between the dataset sequences for the associated dna and protein sequence objects
\r
118 public void addMap(SequenceI dnaseq, SequenceI aaseq, MapList map)
\r
123 nlen = dnaSeqs.length+1;
\r
125 SequenceI[] ndna = new SequenceI[nlen];
\r
126 Mapping[] ndtp = new Mapping[nlen];
\r
129 System.arraycopy(dnaSeqs,0,ndna, 0, dnaSeqs.length);
\r
130 System.arraycopy(dnaToProt,0,ndtp, 0, dnaSeqs.length);
\r
135 dnaSeqs[nlen] = (dnaseq.getDatasetSequence()==null) ? dnaseq : dnaseq.getDatasetSequence();
\r
136 Mapping mp = new Mapping(map);
\r
137 mp.to = (aaseq.getDatasetSequence()==null) ? aaseq : aaseq.getDatasetSequence();
\r
138 a_aaSeqs.addElement(aaseq);
\r
139 dnaToProt[nlen] = mp;
\r
143 public SequenceI[] getdnaSeqs()
\r
147 public SequenceI[] getAaSeqs()
\r
149 if (dnaToProt==null)
\r
151 SequenceI[] sqs = new SequenceI[dnaToProt.length];
\r
152 for (int sz=0; sz<dnaToProt.length; sz++)
\r
154 sqs[sz] = dnaToProt[sz].to;
\r
158 public MapList[] getdnaToProt()
\r
160 if (dnaToProt==null)
\r
162 MapList[] sqs = new MapList[dnaToProt.length];
\r
163 for (int sz=0; sz<dnaToProt.length; sz++)
\r
165 sqs[sz] = dnaToProt[sz].map;
\r
169 public Mapping[] getProtMappings()
\r
175 * @param sequenceRef
\r
176 * @return null or corresponding aaSeq entry for dnaSeq entry
\r
178 public SequenceI getAaForDnaSeq(SequenceI dnaSeqRef)
\r
184 SequenceI dnads = dnaSeqRef.getDatasetSequence();
\r
185 for (int ds=0;ds<dnaSeqs.length; ds++)
\r
187 if (dnaSeqs[ds]==dnaSeqRef || dnaSeqs[ds]==dnads)
\r
188 return dnaToProt[ds].to;
\r
194 * @param sequenceRef
\r
195 * @return null or corresponding aaSeq entry for dnaSeq entry
\r
197 public SequenceI getDnaForAaSeq(SequenceI aaSeqRef)
\r
199 if (dnaToProt==null)
\r
203 SequenceI aads = aaSeqRef.getDatasetSequence();
\r
204 for (int as=0;as<dnaToProt.length; as++)
\r
206 if (dnaToProt[as].to==aaSeqRef || dnaToProt[as].to==aads)
\r
207 return dnaSeqs[as];
\r
212 * test to see if codon frame involves seq in any way
\r
213 * @param seq a nucleotide or protein sequence
\r
214 * @return true if a mapping exists to or from this sequence to any translated sequence
\r
216 public boolean involvesSequence(SequenceI seq)
\r
218 return getAaForDnaSeq(seq)!=null || getDnaForAaSeq(seq)!=null;
\r
221 * Add search results for regions in other sequences that translate or are translated from a particular position in seq
\r
223 * @param index position in seq
\r
224 * @param results where highlighted regions go
\r
226 public void markMappedRegion(SequenceI seq, int index, SearchResults results)
\r
229 SequenceI ds = seq.getDatasetSequence();
\r
230 for (int mi = 0; mi<dnaToProt.length; mi++)
\r
232 if (dnaSeqs[mi]==seq || dnaSeqs[mi]==ds)
\r
234 // DEBUG System.err.println("dna pos "+index);
\r
235 codon = dnaToProt[mi].map.locateInTo(index,index);
\r
238 for (int i=0; i<codon.length; i+=2)
\r
240 results.addResult(dnaToProt[mi].to, codon[i], codon[i+1]);
\r
244 if (dnaToProt[mi].to==seq || dnaToProt[mi].to==ds)
\r
246 // DEBUG System.err.println("aa pos "+index);
\r
248 codon = dnaToProt[mi].map.locateInFrom(index, index);
\r
251 for (int i=0; i<codon.length; i+=2)
\r
253 results.addResult(dnaSeqs[mi], codon[i], codon[i+1]);
\r