src/hg/lib/bamFile.c 1.21

1.21 2010/03/03 19:30:02 angie
Bam track improvements: 1. Enable indel-coloring. 2. Display soft-clipped sequence instead of pretending it doesn't exist.
Index: src/hg/lib/bamFile.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/bamFile.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -b -B -U 4 -r1.20 -r1.21
--- src/hg/lib/bamFile.c	25 Feb 2010 22:05:02 -0000	1.20
+++ src/hg/lib/bamFile.c	3 Mar 2010 19:30:02 -0000	1.21
@@ -288,18 +288,18 @@
  * reverse-complements query sequence when the alignment is on the - strand,
  * so if useStrand is given we rev-comp it back to restore the original query 
  * sequence. */
 {
-int softClipLow, softClipHigh, clippedQLen;
-bamGetSoftClipping(bam, &softClipLow, &softClipHigh, &clippedQLen);
-char *qSeq = needMem(clippedQLen+1);
+const bam1_core_t *core = &bam->core;
+int qLen = core->l_qseq;
+char *qSeq = needMem(qLen+1);
 uint8_t *packedQSeq = bam1_seq(bam);
 int i;
-for (i = 0; i < clippedQLen; i++)
-    qSeq[i] = bam_nt16_rev_table[bam1_seqi(packedQSeq, i+softClipLow)];
+for (i = 0; i < qLen; i++)
+    qSeq[i] = bam_nt16_rev_table[bam1_seqi(packedQSeq, i)];
 qSeq[i] = '\0';
 if (useStrand && bamIsRc(bam))
-    reverseComplement(qSeq, clippedQLen);
+    reverseComplement(qSeq, qLen);
 return qSeq;
 }
 
 UBYTE *bamGetQueryQuals(const bam1_t *bam, boolean useStrand)
@@ -309,14 +309,12 @@
 int qLen = core->l_qseq;
 UBYTE *arr = needMem(qLen);
 boolean isRc = useStrand && bamIsRc(bam);
 UBYTE *qualStr = bam1_qual(bam);
-int softClipLow, softClipHigh, clippedQLen;
-bamGetSoftClipping(bam, &softClipLow, &softClipHigh, &clippedQLen);
 int i;
-for (i = 0;  i < clippedQLen;  i++)
+for (i = 0;  i < core->l_qseq;  i++)
     {
-    int offset = isRc ? (qLen - 1 - softClipHigh - i) : (i + softClipLow);
+    int offset = isRc ? (qLen - 1 - i) : i;
     arr[i] = (qualStr[0] == 255) ? 255 : qualStr[offset];
     }
 return arr;
 }
@@ -448,15 +446,18 @@
 return tLength;
 }
 
 struct ffAli *bamToFfAli(const bam1_t *bam, struct dnaSeq *target, int targetOffset,
-			 boolean useStrand)
-/* Convert from bam to ffAli format.  (Adapted from psl.c's pslToFfAli.) */
+			 boolean useStrand, char **retQSeq)
+/* Convert from bam to ffAli format.  If retQSeq is non-null, set it to the 
+ * query sequence into which ffAli needle pointers point. (Adapted from psl.c's pslToFfAli.) */
 {
 struct ffAli *ffList = NULL, *ff;
 const bam1_core_t *core = &bam->core;
 boolean isRc = useStrand && bamIsRc(bam);
 DNA *needle = (DNA *)bamGetQuerySequence(bam, useStrand);
+if (retQSeq)
+    *retQSeq = needle;
 if (isRc)
     reverseComplement(target->dna, target->size);
 DNA *haystack = target->dna;
 unsigned int *cigarPacked = bam1_cigar(bam);
@@ -481,15 +482,15 @@
 	    tStart += size;
 	    qStart += size;
 	    break;
 	case 'I': // inserted in query
+	case 'S': // skipped query bases at beginning or end ("soft clipping")
 	    qStart += size;
 	    break;
 	case 'D': // deleted from query
 	case 'N': // long deletion from query (intron as opposed to small del)
 	    tStart += size;
 	    break;
-	case 'S': // skipped query bases at beginning or end ("soft clipping")
 	case 'H': // skipped query bases not stored in record's query sequence ("hard clipping")
 	case 'P': // P="silent deletion from padded reference sequence" -- ignore these.
 	    break;
 	default: