1 package jalview.datamodel;
3 public class CigarArray extends CigarBase
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.
11 * array of subject cigars
13 public CigarSimple refCigars[]=null;
14 private boolean seqcigararray=false;
15 private CigarArray() {
21 * @return boolean true if all refCigars resolve to a SeqCigar or a CigarCigar
23 public boolean isSeqCigarArray()
28 * Apply CIGAR operations to several cigars in parallel
29 * will throw an error if any of cigar are actually CigarArrays.
30 * @param cigar Cigar[]
32 public CigarArray(CigarSimple[] cigars) {
35 if (cigars != null && cigars.length > 0)
37 refCigars = new CigarSimple[cigars.length];
38 for (int c = 0; c < cigars.length; c++)
40 refCigars[c] = cigars[c];
41 if (! ( (cigars[c] instanceof SeqCigar)
42 || cigars[c] instanceof CigarCigar))
44 seqcigararray = false;
50 * @see Cigar.getSequenceAndDeletions
54 protected Object[][] getArrayofSequenceAndDeletions(char GapChar) {
55 if (refCigars == null || refCigars.length == 0 || length == 0) {
58 Object[][] sqanddels = new Object[refCigars.length][];
59 for (int c=0; c<refCigars.length; c++) {
60 String refString = refCigars[c].getSequenceString(GapChar);
61 if (refString != null)
63 sqanddels[c] = getSequenceAndDeletions(refString, GapChar);
71 * NOTE: this is an improper sequence string function
72 * @return String formed by newline concatenated results of applying CIGAR operations to each reference object in turn.
74 * @return '\n' separated strings (empty results included as \n\n)
76 public String getSequenceString(char GapChar)
78 if (length==0 || refCigars==null)
80 StringBuffer seqStrings = new StringBuffer();
81 Object[][] sqanddels = getArrayofSequenceAndDeletions(GapChar);
82 for (int c=0; c<refCigars.length; c++) {
83 if (sqanddels[c]!=null) {
84 seqStrings.append( (String) sqanddels[c][0]);
85 sqanddels[c][0] = null;
87 seqStrings.append('\n');
89 return seqStrings.toString();
92 * return string results of applying cigar string to all reference cigars
96 public String[] getSequenceStrings(char GapChar) {
98 if (length==0 || refCigars==null || refCigars.length==0)
100 Object[][] sqanddels = getArrayofSequenceAndDeletions(GapChar);
101 String[] seqs = new String[sqanddels.length];
102 for (int c=0; c<refCigars.length; c++) {
103 seqs[c] = (String) sqanddels[c][0];
108 * Combines the CigarArray cigar operations with the operations in each
109 * reference cigar - creating a new reference cigar
112 public CigarBase[] getEditedCigars() {
114 return new CigarBase[] {};
119 * edits underlying refCigars to propagate deleted regions, and removes deletion
120 * operations from CigarArray operation list.
121 * @return int[] position where deletion occured in cigarArray or null if none occured
123 public int[] applyDeletions()
125 java.util.Vector delpos=null;
128 int cursor=0; // range counter for deletions
129 int vcursor=0; // visible column index
130 for (int i=0; i<length; i++) {
131 if (operation[i]!=D) {
139 delpos=new java.util.Vector();
140 int delstart=cursor, delend=cursor+range[i]-1; // inclusive
141 delpos.add(new Integer(vcursor-1)); // index of left hand column of hidden region boundary
142 System.arraycopy(operation, i+1, operation, i, length-i);
143 System.arraycopy(range, i+1, range, i, length-i);
145 for (int s=0; s<refCigars.length; s++) {
146 refCigars[s].deleteRange(delstart, delend);
152 int[] pos=new int[delpos.size()];
153 for (int k = 0, l = delpos.size(); k < l; k++) {
154 pos[k] = ((Integer) delpos.get(k)).intValue();
164 * @return SeqCigar[] or null if CigarArray is not a SeqCigarArray (ie it does not resolve to set of seqCigars)
166 public SeqCigar[] getSeqCigarArray() {
167 if (!isSeqCigarArray())
169 SeqCigar[] sa = new SeqCigar[refCigars.length];
170 for (int i=0; i<refCigars.length; i++)
171 sa[i] = (SeqCigar) refCigars[i];