+
+ }
+ return newRead.toString();
+ }
+
+ private String applyCigar(String read, CigarElement el, char gapChar,
+ int next, int length, int softStart)
+ {
+ StringBuilder newRead = new StringBuilder();
+ switch (el.getOperator())
+ {
+ case M:
+ case X:
+ case EQ:
+ // matched or mismatched residues
+ newRead.append(read.substring(next, next + length));
+ next += length;
+ break;
+ case N: // intron in RNA
+ case D: // deletion
+ addGaps(newRead, length, gapChar);
+ break;
+ case S:
+ // soft clipping - just skip this bit of the read
+ // do nothing
+
+ // work out how many gaps we need before the start of the soft clip -
+ // don't do this at the end of the read!
+ if (next == 0) // at start of read
+ {
+ addGaps(newRead, softStart, gapChar);
+ }
+
+ newRead.append(read.substring(next, next + length).toLowerCase());
+ next += length;
+ break;
+ case I:
+ // the reference sequence and other reads should have been gapped for
+ // this insertion, so just add in the residues
+ newRead.append(read.substring(next, next + length));
+ next += length;
+ break;
+ case H:
+ // hard clipping - this stretch will not appear in the read
+ break;
+ default:
+ break;