b29f1fbf93c9df5aa65fed050d9f8132dc6a2c73 braney Tue Nov 24 14:20:10 2015 -0800 support htslib for sam/bam/cram/tabix support #14717 diff --git src/hg/hgTables/bam.c src/hg/hgTables/bam.c index 341c781..68ed386 100644 --- src/hg/hgTables/bam.c +++ src/hg/hgTables/bam.c @@ -302,31 +302,36 @@ } slReverse(&bedList); return bedList; } struct slName *randomBamIds(char *table, struct sqlConnection *conn, int count) /* Return some semi-random qName based IDs from a BAM file. */ { /* Read 10000 items from bam file, or if they ask for a big list, then 4x what they ask for. */ char *fileName = bamFileName(table, conn, NULL); samfile_t *fh = bamOpen(fileName, NULL); struct lm *lm = lmInit(0); int orderedCount = count * 4; if (orderedCount < 10000) orderedCount = 10000; +#ifdef USE_HTS +bam_hdr_t *header = sam_hdr_read(fh); +struct samAlignment *sam, *samList = bamReadNextSamAlignments(fh, header, orderedCount, lm); +#else struct samAlignment *sam, *samList = bamReadNextSamAlignments(fh, orderedCount, lm); +#endif /* Shuffle list and extract qNames from first count of them. */ shuffleList(&samList); struct slName *randomIdList = NULL; int i; for (i=0, sam = samList; i<count && sam != NULL; ++i, sam = sam->next) slNameAddHead(&randomIdList, sam->qName); /* Clean up and go home. */ lmCleanup(&lm); bamClose(&fh); freez(&fileName); return randomIdList; } @@ -367,31 +372,36 @@ hTableStart(); /* Print field names as column headers for example */ hPrintf("<TR>"); int colIx = 0; for (col = as->columnList; col != NULL; col = col->next) { hPrintf("<TH>%s</TH>", col->name); ++colIx; } hPrintf("</TR>\n"); /* Fetch sample rows. */ samfile_t *fh = bamOpen(fileName, NULL); struct lm *lm = lmInit(0); +#ifdef USE_HTS +bam_hdr_t *header = sam_hdr_read(fh); +struct samAlignment *sam, *samList = bamReadNextSamAlignments(fh, header, 10, lm); +#else struct samAlignment *sam, *samList = bamReadNextSamAlignments(fh, 10, lm); +#endif /* Print sample lines. */ char *row[SAMALIGNMENT_NUM_COLS]; char numBuf[BAM_NUM_BUF_SIZE]; for (sam=samList; sam != NULL; sam = sam->next) { samAlignmentToRow(sam, numBuf, row); hPrintf("<TR>"); for (colIx=0; colIx<colCount; ++colIx) { hPrintf("<TD>"); xmlEscapeStringToFile(row[colIx], stdout); hPrintf("</TD>"); } hPrintf("</TR>\n");