fdb4b5d215ff23b0f066a9b7d7a96ae31045a347 braney Fri Jan 15 12:27:29 2016 -0800 yet more work on support CRAM under htslib diff --git src/hg/lib/hgBam.c src/hg/lib/hgBam.c index 3dd36e3..6565075 100644 --- src/hg/lib/hgBam.c +++ src/hg/lib/hgBam.c @@ -1,41 +1,27 @@ /* bamFile -- interface to binary alignment format files using Heng Li's samtools lib. */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "hdb.h" #include "hgBam.h" #ifdef USE_BAM #include "htmshell.h" #include "samAlignment.h" -#include "hgConfig.h" - -void cramInit(struct trackDb *tdb) -/* Initialize variables needed for CRAM parsing. */ -{ -char *cramRef; -if ((cramRef = cfgOption("cramRef")) != NULL) - { - setenv("REF_CACHE", cramRef, TRUE); - } -char *refPath = trackDbSetting(tdb, "refPath"); -if (refPath != NULL) - setenv("REF_PATH", refPath, TRUE); -} char *bamFileNameFromTable(struct sqlConnection *conn, char *table, char *bamSeqName) /* Return file name from table. If table has a seqName column, then grab the * row associated with bamSeqName (which can be e.g. '1' not 'chr1' if that is the * case in the bam file). */ { boolean checkSeqName = (sqlFieldIndex(conn, table, "seqName") >= 0); if (checkSeqName && bamSeqName == NULL) errAbort("bamFileNameFromTable: table %s has seqName column, but NULL seqName passed in", table); char query[512]; if (checkSeqName) sqlSafef(query, sizeof(query), "select fileName from %s where seqName = '%s'", table, bamSeqName); else @@ -197,48 +183,57 @@ char *bamQual = (char *)bam1_qual(bam); if (isAllSameChar(bamQual, core->l_qseq, -1)) sam->qual = "*"; else { sam->qual = lmCloneStringZ(lm, bamQual, core->l_qseq); addToChars(sam->qual, core->l_qseq, 33); } dyStringClear(dy); bamUnpackAux(bam, dy); sam->tagTypeVals = lmCloneStringZ(lm, dy->string, dy->stringSize); slAddHead(&helper->samList, sam); return 0; } -struct samAlignment *bamFetchSamAlignment(char *fileOrUrl, char *chrom, int start, int end, - struct lm *lm) +struct samAlignment *bamFetchSamAlignmentPlus(char *fileOrUrl, char *chrom, int start, int end, + struct lm *lm, char *refUrl, char *cacheDir) /* Fetch region as a list of samAlignments - which is more or less an unpacked * bam record. Results is allocated out of lm, since it tends to be large... */ { struct bamToSamHelper helper; helper.lm = lm; helper.chrom = chrom; helper.dy = dyStringNew(0); helper.samList = NULL; char posForBam[256]; safef(posForBam, sizeof(posForBam), "%s:%d-%d", chrom, start+1, end); -bamFetch(fileOrUrl, posForBam, bamAddOneSamAlignment, &helper, &helper.samFile); +bamFetchPlus(fileOrUrl, posForBam, bamAddOneSamAlignment, &helper, &helper.samFile, + refUrl, cacheDir); dyStringFree(&helper.dy); slReverse(&helper.samList); return helper.samList; } +struct samAlignment *bamFetchSamAlignment(char *fileOrUrl, char *chrom, int start, int end, + struct lm *lm) +/* Fetch region as a list of samAlignments - which is more or less an unpacked + * bam record. Results is allocated out of lm, since it tends to be large... */ +{ +return bamFetchSamAlignmentPlus(fileOrUrl, chrom, start, end, lm, NULL, NULL); +} + #ifdef USE_HTS struct samAlignment *bamReadNextSamAlignments(samfile_t *fh, bam_hdr_t *header, int count, struct lm *lm) #else struct samAlignment *bamReadNextSamAlignments(samfile_t *fh, int count, struct lm *lm) #endif /* Read next count alignments in SAM format, allocated in lm. May return less than * count at end of file. */ { /* Set up helper. */ struct bamToSamHelper helper; helper.lm = lm; helper.chrom = NULL; helper.dy = dyStringNew(0); helper.samFile = fh; helper.samList = NULL;