JAL-2360 simplify nucleotide flag, remove setter
[jalview.git] / src / jalview / datamodel / AlignmentI.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General License for more details.
16  * 
17  * You should have received a copy of the GNU General License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.datamodel;
22
23 import java.util.Hashtable;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.Set;
27
28 /**
29  * Data structure to hold and manipulate a multiple sequence alignment
30  */
31 public interface AlignmentI extends AnnotatedCollectionI
32 {
33   /**
34    * Calculates the number of sequences in an alignment
35    * 
36    * @return Number of sequences in alignment
37    */
38   int getHeight();
39
40   /**
41    * 
42    * Calculates the maximum width of the alignment, including gaps.
43    * 
44    * @return Greatest sequence length within alignment, or -1 if no sequences
45    *         present
46    */
47   @Override
48   int getWidth();
49
50   /**
51    * Calculates if this set of sequences (visible and invisible) are all the
52    * same length
53    * 
54    * @return true if all sequences in alignment are the same length
55    */
56   boolean isAligned();
57
58   /**
59    * Calculates if this set of sequences is all the same length
60    * 
61    * @param includeHidden
62    *          optionally exclude hidden sequences from test
63    * @return true if all (or just visible) sequences are the same length
64    */
65   boolean isAligned(boolean includeHidden);
66
67   /**
68    * Gets sequences as a Synchronized collection
69    * 
70    * @return All sequences in alignment.
71    */
72   @Override
73   List<SequenceI> getSequences();
74
75   /**
76    * Gets sequences as a SequenceI[]
77    * 
78    * @return All sequences in alignment.
79    */
80   SequenceI[] getSequencesArray();
81
82   /**
83    * Find a specific sequence in this alignment.
84    * 
85    * @param i
86    *          Index of required sequence.
87    * 
88    * @return SequenceI at given index.
89    */
90   SequenceI getSequenceAt(int i);
91
92   /**
93    * Returns a map of lists of sequences keyed by sequence name.
94    * 
95    * @return
96    */
97   Map<String, List<SequenceI>> getSequencesByName();
98
99   /**
100    * Add a new sequence to this alignment.
101    * 
102    * @param seq
103    *          New sequence will be added at end of alignment.
104    */
105   void addSequence(SequenceI seq);
106
107   /**
108    * Used to set a particular index of the alignment with the given sequence.
109    * 
110    * @param i
111    *          Index of sequence to be updated. if i>length, sequence will be
112    *          added to end, with no intervening positions.
113    * @param seq
114    *          New sequence to be inserted. The existing sequence at position i
115    *          will be replaced.
116    * @return existing sequence (or null if i>current length)
117    */
118   SequenceI replaceSequenceAt(int i, SequenceI seq);
119
120   /**
121    * Deletes a sequence from the alignment
122    * 
123    * @param s
124    *          Sequence to be deleted.
125    */
126   void deleteSequence(SequenceI s);
127
128   /**
129    * Deletes a sequence from the alignment.
130    * 
131    * @param i
132    *          Index of sequence to be deleted.
133    */
134   void deleteSequence(int i);
135
136   /**
137    * Finds sequence in alignment using sequence name as query.
138    * 
139    * @param name
140    *          Id of sequence to search for.
141    * 
142    * @return Sequence matching query, if found. If not found returns null.
143    */
144   SequenceI findName(String name);
145
146   SequenceI[] findSequenceMatch(String name);
147
148   /**
149    * Finds index of a given sequence in the alignment.
150    * 
151    * @param s
152    *          Sequence to look for.
153    * 
154    * @return Index of sequence within the alignment or -1 if not found
155    */
156   int findIndex(SequenceI s);
157
158   /**
159    * Finds group that given sequence is part of.
160    * 
161    * @param s
162    *          Sequence in alignment.
163    * 
164    * @return First group found for sequence. WARNING : Sequences may be members
165    *         of several groups. This method is incomplete.
166    */
167   SequenceGroup findGroup(SequenceI s);
168
169   /**
170    * Finds all groups that a given sequence is part of.
171    * 
172    * @param s
173    *          Sequence in alignment.
174    * 
175    * @return All groups containing given sequence.
176    */
177   SequenceGroup[] findAllGroups(SequenceI s);
178
179   /**
180    * Adds a new SequenceGroup to this alignment.
181    * 
182    * @param sg
183    *          New group to be added.
184    */
185   void addGroup(SequenceGroup sg);
186
187   /**
188    * Deletes a specific SequenceGroup
189    * 
190    * @param g
191    *          Group will be deleted from alignment.
192    */
193   void deleteGroup(SequenceGroup g);
194
195   /**
196    * Get all the groups associated with this alignment.
197    * 
198    * @return All groups as a list.
199    */
200   List<SequenceGroup> getGroups();
201
202   /**
203    * Deletes all groups from this alignment.
204    */
205   void deleteAllGroups();
206
207   /**
208    * Adds a new AlignmentAnnotation to this alignment
209    * 
210    * @note Care should be taken to ensure that annotation is at least as wide as
211    *       the longest sequence in the alignment for rendering purposes.
212    */
213   void addAnnotation(AlignmentAnnotation aa);
214
215   /**
216    * moves annotation to a specified index in alignment annotation display stack
217    * 
218    * @param aa
219    *          the annotation object to be moved
220    * @param index
221    *          the destination position
222    */
223   void setAnnotationIndex(AlignmentAnnotation aa, int index);
224
225   /**
226    * Delete all annotations, including auto-calculated if the flag is set true.
227    * Returns true if at least one annotation was deleted, else false.
228    * 
229    * @param includingAutoCalculated
230    * @return
231    */
232   boolean deleteAllAnnotations(boolean includingAutoCalculated);
233
234   /**
235    * Deletes a specific AlignmentAnnotation from the alignment, and removes its
236    * reference from any SequenceI or SequenceGroup object's annotation if and
237    * only if aa is contained within the alignment's annotation vector.
238    * Otherwise, it will do nothing.
239    * 
240    * @param aa
241    *          the annotation to delete
242    * @return true if annotation was deleted from this alignment.
243    */
244   boolean deleteAnnotation(AlignmentAnnotation aa);
245
246   /**
247    * Deletes a specific AlignmentAnnotation from the alignment, and optionally
248    * removes any reference from any SequenceI or SequenceGroup object's
249    * annotation if and only if aa is contained within the alignment's annotation
250    * vector. Otherwise, it will do nothing.
251    * 
252    * @param aa
253    *          the annotation to delete
254    * @param unhook
255    *          flag indicating if any references should be removed from
256    *          annotation - use this if you intend to add the annotation back
257    *          into the alignment
258    * @return true if annotation was deleted from this alignment.
259    */
260   boolean deleteAnnotation(AlignmentAnnotation aa, boolean unhook);
261
262   /**
263    * Get the annotation associated with this alignment (this can be null if no
264    * annotation has ever been created on the alignment)
265    * 
266    * @return array of AlignmentAnnotation objects
267    */
268   @Override
269   AlignmentAnnotation[] getAlignmentAnnotation();
270
271   /**
272    * Change the gap character used in this alignment to 'gc'
273    * 
274    * @param gc
275    *          the new gap character.
276    */
277   void setGapCharacter(char gc);
278
279   /**
280    * Get the gap character used in this alignment
281    * 
282    * @return gap character
283    */
284   char getGapCharacter();
285
286   /**
287    * Test for all nucleotide alignment
288    * 
289    * @return true if alignment is nucleotide sequence
290    */
291   boolean isNucleotide();
292
293   /**
294    * Test if alignment contains RNA structure
295    * 
296    * @return true if RNA structure AligmnentAnnotation was added to alignment
297    */
298   boolean hasRNAStructure();
299
300   /**
301    * Get the associated dataset for the alignment.
302    * 
303    * @return Alignment containing dataset sequences or null of this is a
304    *         dataset.
305    */
306   AlignmentI getDataset();
307
308   /**
309    * Set the associated dataset for the alignment, or create one.
310    * 
311    * @param dataset
312    *          The dataset alignment or null to construct one.
313    */
314   void setDataset(AlignmentI dataset);
315
316   /**
317    * pads sequences with gaps (to ensure the set looks like an alignment)
318    * 
319    * @return boolean true if alignment was modified
320    */
321   boolean padGaps();
322
323   HiddenSequences getHiddenSequences();
324
325   /**
326    * Compact representation of alignment
327    * 
328    * @return CigarArray
329    */
330   CigarArray getCompactAlignment();
331
332   /**
333    * Set an arbitrary key value pair for an alignment. Note: both key and value
334    * objects should return a meaningful, human readable response to .toString()
335    * 
336    * @param key
337    * @param value
338    */
339   void setProperty(Object key, Object value);
340
341   /**
342    * Get a named property from the alignment.
343    * 
344    * @param key
345    * @return value of property
346    */
347   Object getProperty(Object key);
348
349   /**
350    * Get the property hashtable.
351    * 
352    * @return hashtable of alignment properties (or null if none are defined)
353    */
354   Hashtable getProperties();
355
356   /**
357    * add a reference to a frame of aligned codons for this alignment
358    * 
359    * @param codons
360    */
361   void addCodonFrame(AlignedCodonFrame codons);
362
363   /**
364    * remove a particular codon frame reference from this alignment
365    * 
366    * @param codons
367    * @return true if codon frame was removed.
368    */
369   boolean removeCodonFrame(AlignedCodonFrame codons);
370
371   /**
372    * get all codon frames associated with this alignment
373    * 
374    * @return
375    */
376   List<AlignedCodonFrame> getCodonFrames();
377
378   /**
379    * Set the codon frame mappings (replacing any existing list).
380    */
381   void setCodonFrames(List<AlignedCodonFrame> acfs);
382
383   /**
384    * get codon frames involving sequenceI
385    */
386   List<AlignedCodonFrame> getCodonFrame(SequenceI seq);
387
388   /**
389    * find sequence with given name in alignment
390    * 
391    * @param token
392    *          name to find
393    * @param b
394    *          true implies that case insensitive matching will <em>also</em> be
395    *          tried
396    * @return matched sequence or null
397    */
398   SequenceI findName(String token, boolean b);
399
400   /**
401    * find next sequence with given name in alignment starting after a given
402    * sequence
403    * 
404    * @param startAfter
405    *          the sequence after which the search will be started (usually the
406    *          result of the last call to findName)
407    * @param token
408    *          name to find
409    * @param b
410    *          true implies that case insensitive matching will <em>also</em> be
411    *          tried
412    * @return matched sequence or null
413    */
414   SequenceI findName(SequenceI startAfter, String token, boolean b);
415
416   /**
417    * find first sequence in alignment which is involved in the given search
418    * result object
419    * 
420    * @param results
421    * @return -1 or index of sequence in alignment
422    */
423   int findIndex(SearchResultsI results);
424
425   /**
426    * append sequences and annotation from another alignment object to this one.
427    * Note: this is a straight transfer of object references, and may result in
428    * toappend's dependent data being transformed to fit the alignment (changing
429    * gap characters, etc...). If you are uncertain, use the copy Alignment copy
430    * constructor to create a new version which can be appended without side
431    * effect.
432    * 
433    * @param toappend
434    *          - the alignment to be appended.
435    */
436   void append(AlignmentI toappend);
437
438   /**
439    * Justify the sequences to the left or right by deleting and inserting gaps
440    * before the initial residue or after the terminal residue
441    * 
442    * @param right
443    *          true if alignment padded to right, false to justify to left
444    * @return true if alignment was changed TODO: return undo object
445    */
446   boolean justify(boolean right);
447
448   /**
449    * add given annotation row at given position (0 is start, -1 is end)
450    * 
451    * @param consensus
452    * @param i
453    */
454   void addAnnotation(AlignmentAnnotation consensus, int i);
455
456   /**
457    * search for or create a specific annotation row on the alignment
458    * 
459    * @param name
460    *          name for annotation (must match)
461    * @param calcId
462    *          calcId for the annotation (null or must match)
463    * @param autoCalc
464    *          - value of autocalc flag for the annotation
465    * @param seqRef
466    *          - null or specific sequence reference
467    * @param groupRef
468    *          - null or specific group reference
469    * @param method
470    *          - CalcId for the annotation (must match)
471    * 
472    * @return existing annotation matching the given attributes
473    */
474   AlignmentAnnotation findOrCreateAnnotation(String name, String calcId,
475           boolean autoCalc, SequenceI seqRef, SequenceGroup groupRef);
476
477   /**
478    * move the given group up or down in the alignment by the given number of
479    * rows. Implementor assumes given group is already present on alignment - no
480    * recalculations are triggered.
481    * 
482    * @param sg
483    * @param map
484    * @param up
485    * @param i
486    */
487   void moveSelectedSequencesByOne(SequenceGroup sg,
488           Map<SequenceI, SequenceCollectionI> map, boolean up);
489
490   /**
491    * validate annotation after an edit and update any alignment state flags
492    * accordingly
493    * 
494    * @param alignmentAnnotation
495    */
496   void validateAnnotation(AlignmentAnnotation alignmentAnnotation);
497
498   /**
499    * Align this alignment the same as the given one. If both of the same type
500    * (nucleotide/protein) then align both identically. If this is nucleotide and
501    * the other is protein, make 3 gaps for each gap in the protein sequences. If
502    * this is protein and the other is nucleotide, insert a gap for each 3 gaps
503    * (or part thereof) between nucleotide bases. Returns the number of mapped
504    * sequences that were realigned .
505    * 
506    * @param al
507    * @return
508    */
509   int alignAs(AlignmentI al);
510
511   /**
512    * Returns the set of distinct sequence names in the alignment.
513    * 
514    * @return
515    */
516   Set<String> getSequenceNames();
517
518   /**
519    * Checks if the alignment has at least one sequence with one non-gaped
520    * residue
521    * 
522    * @return
523    */
524   public boolean hasValidSequence();
525
526   /**
527    * Update any mappings to 'virtual' sequences to compatible real ones, if
528    * present in the added sequences. Returns a count of mappings updated.
529    * 
530    * @param seqs
531    * @return
532    */
533   int realiseMappings(List<SequenceI> seqs);
534
535   /**
536    * Returns the first AlignedCodonFrame that has a mapping between the given
537    * dataset sequences
538    * 
539    * @param mapFrom
540    * @param mapTo
541    * @return
542    */
543   AlignedCodonFrame getMapping(SequenceI mapFrom, SequenceI mapTo);
544
545   /**
546    * Calculate the visible start and end index of an alignment. The result is
547    * returned an int array where: int[0] = startIndex, and int[1] = endIndex.
548    * 
549    * @param hiddenCols
550    * @return
551    */
552   public int[] getVisibleStartAndEndIndex(List<int[]> hiddenCols);
553 }