+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[] {};
+ }
+}