CigarBase class and derivatives.
authorjprocter <Jim Procter>
Wed, 26 Jul 2006 13:43:24 +0000 (13:43 +0000)
committerjprocter <Jim Procter>
Wed, 26 Jul 2006 13:43:24 +0000 (13:43 +0000)
src/jalview/datamodel/CigarArray.java [new file with mode: 0644]

diff --git a/src/jalview/datamodel/CigarArray.java b/src/jalview/datamodel/CigarArray.java
new file mode 100644 (file)
index 0000000..447b4d0
--- /dev/null
@@ -0,0 +1,117 @@
+package jalview.datamodel;
+
+public class CigarArray extends CigarBase
+{
+    /**
+     * Do CIGAR operations on a set of sequences from many other cigars
+     * BAD THINGS WILL HAPPEN IF A CIGARARRAY IS PASSED TO A CIGARARRAY
+     * or a CIGARCIGAR is given a CIGARARRAY to insert gaps into.
+     */
+    /**
+     * array of subject cigars
+     */
+    public CigarSimple refCigars[]=null;
+    private boolean seqcigararray=false;
+  private CigarArray() {
+    super();
+  }
+
+  /**
+   * isSeqCigarArray()
+   * @return boolean true if all refCigars resolve to a SeqCigar or a CigarCigar
+   */
+  public boolean isSeqCigarArray()
+  {
+    return seqcigararray;
+  }
+
+  /**
+   * Apply CIGAR operations to several cigars in parallel
+   * will throw an error if any of cigar are actually CigarArrays.
+   * @param cigar Cigar[]
+   */
+  public CigarArray(CigarSimple[] cigars) {
+    super();
+    seqcigararray = true;
+    if (cigars != null && cigars.length > 0)
+    {
+      refCigars = new CigarSimple[cigars.length];
+      for (int c = 0; c < cigars.length; c++)
+      {
+        refCigars[c] = cigars[c];
+        if (! ( (cigars[c] instanceof SeqCigar)
+               || cigars[c] instanceof CigarCigar))
+        {
+          seqcigararray = false;
+        }
+      }
+    }
+  }
+  /**
+   * @see Cigar.getSequenceAndDeletions
+   * @param GapChar char
+   * @return Object[][]
+   */
+  protected Object[][] getArrayofSequenceAndDeletions(char GapChar) {
+      if (refCigars == null || refCigars.length == 0 || length == 0) {
+        return null;
+      }
+      Object[][] sqanddels = new Object[refCigars.length][];
+      for (int c=0; c<refCigars.length; c++) {
+        String refString = refCigars[c].getSequenceString(GapChar);
+        if (refString != null)
+        {
+          sqanddels[c] = getSequenceAndDeletions(refString, GapChar);
+        } else {
+          sqanddels[c] = null;
+        }
+      }
+      return sqanddels;
+    }
+  /**
+   * NOTE: this is an improper sequence string function
+   * @return String formed by newline concatenated results of applying CIGAR operations to each reference object in turn.
+   * @param GapChar char
+   * @return '\n' separated strings (empty results included as \n\n)
+   */
+  public String getSequenceString(char GapChar)
+  {
+    if (length==0 || refCigars==null)
+      return "";
+    StringBuffer seqStrings = new StringBuffer();
+    Object[][] sqanddels = getArrayofSequenceAndDeletions(GapChar);
+    for (int c=0; c<refCigars.length; c++) {
+      if (sqanddels[c]!=null) {
+        seqStrings.append( (String) sqanddels[c][0]);
+        sqanddels[c][0] = null;
+      }
+      seqStrings.append('\n');
+    }
+    return seqStrings.toString();
+  }
+  /**
+   * return string results of applying cigar string to all reference cigars
+   * @param GapChar char
+   * @return String[]
+   */
+  public String[] getSequenceStrings(char GapChar) {
+
+    if (length==0 || refCigars==null || refCigars.length==0)
+      return null;
+    Object[][] sqanddels = getArrayofSequenceAndDeletions(GapChar);
+    String[] seqs = new String[sqanddels.length];
+    for (int c=0; c<refCigars.length; c++) {
+      seqs[c] = (String) sqanddels[c][0];
+    }
+    return seqs;
+  }
+  /**
+   * Combines the CigarArray cigar operations with the operations in each
+   * reference cigar - creating a new reference cigar
+   * @return Cigar[]
+   */
+  public CigarBase[] getEditedCigars() {
+
+    return new CigarBase[] {};
+  }
+}