d8fee47cc2b32a995a9aac374c55b63cb18d896b braney Sat Mar 5 18:11:18 2011 -0800 fix some problems with BAM support. Actually look at id's for filtering, and disable subtrack merge. diff --git src/hg/hgTables/bam.c src/hg/hgTables/bam.c index 1c1b86d..185a9bc 100644 --- src/hg/hgTables/bam.c +++ src/hg/hgTables/bam.c @@ -253,71 +253,75 @@ case 'N': // long deletion from query (intron as opposed to small del) tLength += n; 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: 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) + char *table, struct asFilter *filter, struct lm *bedLm, struct bed **pBedList, struct hash *idHash) /* 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); 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)); bed->name = lmCloneString(bedLm, sam->qName); slAddHead(pBedList, bed); } } lmCleanup(&lm); } struct bed *bamGetFilteredBedsOnRegions(struct sqlConnection *conn, char *db, char *table, struct region *regionList, struct lm *lm, int *retFieldCount) /* Get list of beds from BAM, in all regions, that pass filtering. */ { /* Figure out bam file name get column info and filter. */ struct asObject *as = bamAsObj(); struct asFilter *filter = asFilterFromCart(cart, db, table, as); +struct hash *idHash = identifierHash(db, table); /* Get beds a region at a time. */ struct bed *bedList = NULL; struct region *region; for (region = regionList; region != NULL; region = region->next) { char *fileName = bamFileName(table, conn, region->chrom); - addFilteredBedsOnRegion(fileName, region, table, filter, lm, &bedList); + addFilteredBedsOnRegion(fileName, region, table, filter, lm, &bedList, idHash); freeMem(fileName); } 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)