CigarBase class and derivatives.
[jalview.git] / src / jalview / datamodel / CigarArray.java
1 package jalview.datamodel;
2
3 public class CigarArray extends CigarBase
4 {
5     /**
6      * Do CIGAR operations on a set of sequences from many other cigars
7      * BAD THINGS WILL HAPPEN IF A CIGARARRAY IS PASSED TO A CIGARARRAY
8      * or a CIGARCIGAR is given a CIGARARRAY to insert gaps into.
9      */
10     /**
11      * array of subject cigars
12      */
13     public CigarSimple refCigars[]=null;
14     private boolean seqcigararray=false;
15   private CigarArray() {
16     super();
17   }
18
19   /**
20    * isSeqCigarArray()
21    * @return boolean true if all refCigars resolve to a SeqCigar or a CigarCigar
22    */
23   public boolean isSeqCigarArray()
24   {
25     return seqcigararray;
26   }
27
28   /**
29    * Apply CIGAR operations to several cigars in parallel
30    * will throw an error if any of cigar are actually CigarArrays.
31    * @param cigar Cigar[]
32    */
33   public CigarArray(CigarSimple[] cigars) {
34     super();
35     seqcigararray = true;
36     if (cigars != null && cigars.length > 0)
37     {
38       refCigars = new CigarSimple[cigars.length];
39       for (int c = 0; c < cigars.length; c++)
40       {
41         refCigars[c] = cigars[c];
42         if (! ( (cigars[c] instanceof SeqCigar)
43                || cigars[c] instanceof CigarCigar))
44         {
45           seqcigararray = false;
46         }
47       }
48     }
49   }
50   /**
51    * @see Cigar.getSequenceAndDeletions
52    * @param GapChar char
53    * @return Object[][]
54    */
55   protected Object[][] getArrayofSequenceAndDeletions(char GapChar) {
56       if (refCigars == null || refCigars.length == 0 || length == 0) {
57         return null;
58       }
59       Object[][] sqanddels = new Object[refCigars.length][];
60       for (int c=0; c<refCigars.length; c++) {
61         String refString = refCigars[c].getSequenceString(GapChar);
62         if (refString != null)
63         {
64           sqanddels[c] = getSequenceAndDeletions(refString, GapChar);
65         } else {
66           sqanddels[c] = null;
67         }
68       }
69       return sqanddels;
70     }
71   /**
72    * NOTE: this is an improper sequence string function
73    * @return String formed by newline concatenated results of applying CIGAR operations to each reference object in turn.
74    * @param GapChar char
75    * @return '\n' separated strings (empty results included as \n\n)
76    */
77   public String getSequenceString(char GapChar)
78   {
79     if (length==0 || refCigars==null)
80       return "";
81     StringBuffer seqStrings = new StringBuffer();
82     Object[][] sqanddels = getArrayofSequenceAndDeletions(GapChar);
83     for (int c=0; c<refCigars.length; c++) {
84       if (sqanddels[c]!=null) {
85         seqStrings.append( (String) sqanddels[c][0]);
86         sqanddels[c][0] = null;
87       }
88       seqStrings.append('\n');
89     }
90     return seqStrings.toString();
91   }
92   /**
93    * return string results of applying cigar string to all reference cigars
94    * @param GapChar char
95    * @return String[]
96    */
97   public String[] getSequenceStrings(char GapChar) {
98
99     if (length==0 || refCigars==null || refCigars.length==0)
100       return null;
101     Object[][] sqanddels = getArrayofSequenceAndDeletions(GapChar);
102     String[] seqs = new String[sqanddels.length];
103     for (int c=0; c<refCigars.length; c++) {
104       seqs[c] = (String) sqanddels[c][0];
105     }
106     return seqs;
107   }
108   /**
109    * Combines the CigarArray cigar operations with the operations in each
110    * reference cigar - creating a new reference cigar
111    * @return Cigar[]
112    */
113   public CigarBase[] getEditedCigars() {
114
115     return new CigarBase[] {};
116   }
117 }