69e65f45d0db6e87a72aa22c5aa61c3c4f6f2412 braney Mon Jul 18 14:33:48 2016 -0700 fix up some problems in table browser with CRAM output #17698 diff --git src/hg/hgTables/bam.c src/hg/hgTables/bam.c index b26dbc9..e547308 100644 --- src/hg/hgTables/bam.c +++ src/hg/hgTables/bam.c @@ -239,32 +239,35 @@ case 'P': // P="silent deletion from padded reference sequence" -- ignore these. break; default: errAbort("cigarWidth: unrecognized CIGAR op %c -- update me", op); } } return tLength; } static void addFilteredBedsOnRegion(char *fileName, struct region *region, char *table, struct asFilter *filter, struct lm *bedLm, struct bed **pBedList, struct hash *idHash, int *pMaxOut) /* Add relevant beds in reverse order to pBedList */ { struct lm *lm = lmInit(0); -struct samAlignment *sam, *samList = bamFetchSamAlignment(fileName, region->chrom, - region->start, region->end, lm); +struct trackDb *tdb = findTdbForTable(database, curTrack, curTable, ctLookupName); +char *cacheDir = cfgOption("cramRef"); +char *refUrl = trackDbSetting(tdb, "refUrl"); +struct samAlignment *sam, *samList = bamFetchSamAlignmentPlus(fileName, region->chrom, + region->start, region->end, lm, refUrl, cacheDir); char *row[SAMALIGNMENT_NUM_COLS]; char numBuf[BAM_NUM_BUF_SIZE]; for (sam = samList; sam != NULL; sam = sam->next) { samAlignmentToRow(sam, numBuf, row); if (asFilterOnRow(filter, row)) { if ((idHash != NULL) && (hashLookup(idHash, sam->qName) == NULL)) continue; struct bed *bed; lmAllocVar(bedLm, bed); bed->chrom = lmCloneString(bedLm, sam->rName); bed->chromStart = sam->pos - 1; bed->chromEnd = bed->chromStart + cigarWidth(sam->cigar, strlen(sam->cigar)); @@ -307,30 +310,37 @@ 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; bam_hdr_t *header = sam_hdr_read(fh); +if (fh->format.format == cram) + { + char *cacheDir = cfgOption("cramRef"); + struct trackDb *tdb = findTdbForTable(database, curTrack, table, ctLookupName); + char *refUrl = trackDbSetting(tdb, "refUrl"); + cram_set_cache_url(fh, cacheDir, refUrl); + } struct samAlignment *sam, *samList = bamReadNextSamAlignments(fh, header, orderedCount, lm); /* 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; } @@ -373,30 +383,37 @@ /* 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); bam_hdr_t *header = sam_hdr_read(fh); +if (fh->format.format == cram) + { + char *cacheDir = cfgOption("cramRef"); + struct trackDb *tdb = findTdbForTable(database, curTrack, table, ctLookupName); + char *refUrl = trackDbSetting(tdb, "refUrl"); + cram_set_cache_url(fh, cacheDir, refUrl); + } struct samAlignment *sam, *samList = bamReadNextSamAlignments(fh, header, 10, lm); /* 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>"); }