JAL-845 implement alignment of protein to match cDNA alignment
[jalview.git] / src / jalview / datamodel / Alignment.java
index f660697..4558d8d 100755 (executable)
@@ -67,6 +67,8 @@ public class Alignment implements AlignmentI
 
   public Hashtable alignmentProperties;
 
+  private Set<AlignedCodonFrame> codonFrameList = new LinkedHashSet<AlignedCodonFrame>();
+
   private void initAlignment(SequenceI[] seqs)
   {
     int i = 0;
@@ -101,6 +103,13 @@ public class Alignment implements AlignmentI
     {
       seqs[i] = new Sequence(seqs[i]);
     }
+
+    /*
+     * Share the same dataset sequence mappings (if any). TODO: find a better
+     * place for these to live (alignment dataset?).
+     */
+    this.codonFrameList = ((Alignment) al).codonFrameList;
+
     initAlignment(seqs);
   }
 
@@ -142,11 +151,6 @@ public class Alignment implements AlignmentI
     // this(compactAlignment.refCigars);
   }
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
   @Override
   public List<SequenceI> getSequences()
   {
@@ -749,6 +753,28 @@ public class Alignment implements AlignmentI
     return true;
   }
 
+  /**
+   * Delete all annotations, including auto-calculated if the flag is set true.
+   * Returns true if at least one annotation was deleted, else false.
+   * 
+   * @param includingAutoCalculated
+   * @return
+   */
+  @Override
+  public boolean deleteAllAnnotations(boolean includingAutoCalculated)
+  {
+    boolean result = false;
+    for (AlignmentAnnotation alan : getAlignmentAnnotation())
+    {
+      if (!alan.autoCalculated || includingAutoCalculated)
+      {
+        deleteAnnotation(alan);
+        result = true;
+      }
+    }
+    return result;
+  }
+
   /*
    * (non-Javadoc)
    * 
@@ -1234,10 +1260,6 @@ public class Alignment implements AlignmentI
     return alignmentProperties;
   }
 
-  // AlignedCodonFrame[] codonFrameList = null;
-
-  LinkedHashSet<AlignedCodonFrame> codonFrameList = new LinkedHashSet<AlignedCodonFrame>();
-
   /*
    * (non-Javadoc)
    * 
@@ -1278,8 +1300,20 @@ public class Alignment implements AlignmentI
     return cframes;
   }
 
-  /*
-   * (non-Javadoc)
+  /**
+   * Sets the codon frame mappings (replacing any existing mappings).
+   * 
+   * @see jalview.datamodel.AlignmentI#setCodonFrames()
+   */
+  @Override
+  public void setCodonFrames(Set<AlignedCodonFrame> acfs)
+  {
+    this.codonFrameList = acfs;
+  }
+
+  /**
+   * Returns the set of codon frame mappings. Any changes to the returned set
+   * will affect the alignment.
    * 
    * @see jalview.datamodel.AlignmentI#getCodonFrames()
    */
@@ -1554,6 +1588,39 @@ public class Alignment implements AlignmentI
     }
   }
 
+
+ private SequenceI seqrep=null;
+
+ /**
+  * 
+  * @return the representative sequence for this group
+  */
+ public SequenceI getSeqrep()
+ {
+   return seqrep;
+ }
+
+ /**
+  * set the representative sequence for this group. Note - this affects the
+  * interpretation of the Hidereps attribute.
+  * 
+  * @param seqrep
+  *          the seqrep to set (null means no sequence representative)
+  */
+ public void setSeqrep(SequenceI seqrep)
+ {
+   this.seqrep = seqrep;
+ }
+
+ /**
+  * 
+  * @return true if group has a sequence representative
+  */
+ public boolean hasSeqrep()
+ {
+   return seqrep != null;
+ }
+
   @Override
   public int getEndRes()
   {
@@ -1621,10 +1688,7 @@ public class Alignment implements AlignmentI
     boolean thatIsProtein = !al.isNucleotide();
     if (!thatIsProtein && !thisIsNucleotide)
     {
-      System.err
-              .println("Alignment of protein from cDNA not yet implemented");
-      return 0;
-      // todo: build it - a variant of Dna.CdnaTranslate()
+      return AlignmentUtils.alignProteinAsDna(this, al);
     }
 
     char thisGapChar = this.getGapCharacter();
@@ -1667,4 +1731,29 @@ public class Alignment implements AlignmentI
     }
     return names;
   }
+
+  /**
+   * Returns a (possibly empty) alignment whose sequences are aligned to match
+   * the current alignment, as mapped by the given codon mappings.
+   * 
+   * @param codonFrames
+   * @return
+   */
+  @Override
+  public AlignmentI getAlignedComplement(Set<AlignedCodonFrame> codonFrames)
+  {
+    // Note: passing codonFrames as a parameter rather than using
+    // this.codonFrameList as more flexible. Specifically, mappings are held
+    // on the protein alignment but we might want to act on dna.
+
+    // TODO we want the gap character of the mapped alignment, not this one!
+    List<SequenceI> alignedSeqs = AlignmentUtils.getAlignedTranslation(
+            getSequences(), getGapCharacter(), codonFrames);
+    final SequenceI[] seqsAsArray = alignedSeqs
+            .toArray(new SequenceI[alignedSeqs.size()]);
+    AlignmentI al = new Alignment(seqsAsArray);
+    al.padGaps();
+    al.setDataset(null);
+    return al;
+  }
 }