[med-svn] [htslib] 03/08: sam: New bam_str2flag and bam_flag2str functions for a more user-friendly setting of bitmasks. Removed the default pileup filters (except for BAM_FUNMAP) and moved the filtering to BAM-reading callbacks

Charles Plessy plessy at moszumanska.debian.org
Wed Dec 4 04:42:19 UTC 2013


This is an automated email from the git hooks/post-receive script.

plessy pushed a commit to branch debian/unstable
in repository htslib.

commit cf12fbaa2e1958659c9c075d940eb16f698ccefd
Author: Petr Danecek <pd3 at sanger.ac.uk>
Date:   Thu Nov 28 11:22:33 2013 +0000

    sam: New bam_str2flag and bam_flag2str functions for a more user-friendly setting of bitmasks. Removed the default pileup filters (except for BAM_FUNMAP) and moved the filtering to BAM-reading callbacks
---
 htslib/sam.h |  3 +++
 sam.c        | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++----------
 2 files changed, 54 insertions(+), 10 deletions(-)

diff --git a/htslib/sam.h b/htslib/sam.h
index 821a015..3d0845d 100644
--- a/htslib/sam.h
+++ b/htslib/sam.h
@@ -184,6 +184,9 @@ extern "C" {
 	*/
 	int32_t bam_endpos(const bam1_t *b);
 
+    int   bam_str2flag(const char *str);    /** returns negative value on error */
+    char *bam_flag2str(int flag);   /** The string must be freed by the user */
+
 	/********************
 	 *** BAM indexing ***
 	 ********************/
diff --git a/sam.c b/sam.c
index e48112a..279a96b 100644
--- a/sam.c
+++ b/sam.c
@@ -922,6 +922,54 @@ char *bam_aux2Z(const uint8_t *s)
 	else return 0;
 }
 
+int bam_str2flag(const char *str)
+{
+    char *end, *beg = (char*) str;
+    long int flag = strtol(str, &end, 0);
+    if ( end!=str ) return flag;    // the conversion was successful
+    flag = 0;
+    while ( *str )
+    {
+        end = beg;
+        while ( *end && *end!=',' ) end++;
+        if ( !strncasecmp(beg,"PAIRED",end-beg) ) flag |= BAM_FPAIRED;
+        else if ( !strncasecmp(beg,"PROPER_PAIR",end-beg) ) flag |= BAM_FPROPER_PAIR;
+        else if ( !strncasecmp(beg,"UNMAP",end-beg) ) flag |= BAM_FUNMAP;
+        else if ( !strncasecmp(beg,"MUNMAP",end-beg) ) flag |= BAM_FMUNMAP;
+        else if ( !strncasecmp(beg,"REVERSE",end-beg) ) flag |= BAM_FREVERSE;
+        else if ( !strncasecmp(beg,"MREVERSE",end-beg) ) flag |= BAM_FMREVERSE;
+        else if ( !strncasecmp(beg,"READ1",end-beg) ) flag |= BAM_FREAD1;
+        else if ( !strncasecmp(beg,"READ2",end-beg) ) flag |= BAM_FREAD2;
+        else if ( !strncasecmp(beg,"SECONDARY",end-beg) ) flag |= BAM_FSECONDARY;
+        else if ( !strncasecmp(beg,"QCFAIL",end-beg) ) flag |= BAM_FQCFAIL;
+        else if ( !strncasecmp(beg,"DUP",end-beg) ) flag |= BAM_FDUP;
+        else if ( !strncasecmp(beg,"SUPPLEMENTARY",end-beg) ) flag |= BAM_FSUPPLEMENTARY;
+        else return -1;
+        if ( !*end ) break;
+        beg = end + 1;
+    }
+    return flag;
+}
+
+char *bam_flag2str(int flag)
+{
+    kstring_t str = {0,0,0};
+    if ( flag&BAM_FPAIRED ) ksprintf(&str,"%s%s", str.l?",":"","PAIRED");
+    if ( flag&BAM_FPROPER_PAIR ) ksprintf(&str,"%s%s", str.l?",":"","PROPER_PAIR");
+    if ( flag&BAM_FUNMAP ) ksprintf(&str,"%s%s", str.l?",":"","UNMAP");
+    if ( flag&BAM_FMUNMAP ) ksprintf(&str,"%s%s", str.l?",":"","MUNMAP");
+    if ( flag&BAM_FREVERSE ) ksprintf(&str,"%s%s", str.l?",":"","REVERSE");
+    if ( flag&BAM_FMREVERSE ) ksprintf(&str,"%s%s", str.l?",":"","MREVERSE");
+    if ( flag&BAM_FREAD1 ) ksprintf(&str,"%s%s", str.l?",":"","READ1");
+    if ( flag&BAM_FREAD2 ) ksprintf(&str,"%s%s", str.l?",":"","READ2");
+    if ( flag&BAM_FSECONDARY ) ksprintf(&str,"%s%s", str.l?",":"","SECONDARY");
+    if ( flag&BAM_FQCFAIL ) ksprintf(&str,"%s%s", str.l?",":"","QCFAIL");
+    if ( flag&BAM_FDUP ) ksprintf(&str,"%s%s", str.l?",":"","DUP");
+    if ( flag&BAM_FSUPPLEMENTARY ) ksprintf(&str,"%s%s", str.l?",":"","SUPPLEMENTARY");
+    return str.s;
+}
+
+
 /**************************
  *** Pileup and Mpileup ***
  **************************/
@@ -930,8 +978,6 @@ char *bam_aux2Z(const uint8_t *s)
 
 #include <assert.h>
 
-#define BAM_DEF_MASK (BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP)
-
 /*******************
  *** Memory pool ***
  *******************/
@@ -1083,7 +1129,7 @@ struct __bam_plp_t {
 	mempool_t *mp;
 	lbnode_t *head, *tail, *dummy;
 	int32_t tid, pos, max_tid, max_pos;
-	int is_eof, flag_mask, max_plp, error, maxcnt;
+	int is_eof, max_plp, error, maxcnt;
 	uint64_t id;
 	bam_pileup1_t *plp;
 	// for the "auto" interface only
@@ -1101,7 +1147,6 @@ bam_plp_t bam_plp_init(bam_plp_auto_f func, void *data)
 	iter->head = iter->tail = mp_alloc(iter->mp);
 	iter->dummy = mp_alloc(iter->mp);
 	iter->max_tid = iter->max_pos = -1;
-	iter->flag_mask = BAM_DEF_MASK;
 	iter->maxcnt = 8000;
 	if (func) {
 		iter->func = func;
@@ -1378,7 +1423,8 @@ int bam_plp_push(bam_plp_t iter, const bam1_t *b)
 	if (iter->error) return -1;
 	if (b) {
 		if (b->core.tid < 0) { overlap_remove(iter, b); return 0; }
-		if (b->core.flag & iter->flag_mask) { overlap_remove(iter, b); return 0; }
+        // Skip only unmapped reads here, any additional filtering must be done in iter->func
+        if (b->core.flag & BAM_FUNMAP) { overlap_remove(iter, b); return 0; }
 		if (iter->tid == b->core.tid && iter->pos == b->core.pos && iter->mp->cnt > iter->maxcnt) 
         { 
             overlap_remove(iter, b); 
@@ -1450,11 +1496,6 @@ void bam_plp_reset(bam_plp_t iter)
 	iter->head = iter->tail;
 }
 
-void bam_plp_set_mask(bam_plp_t iter, int mask)
-{
-	iter->flag_mask = mask < 0? BAM_DEF_MASK : (BAM_FUNMAP | mask);
-}
-
 void bam_plp_set_maxcnt(bam_plp_t iter, int maxcnt)
 {
 	iter->maxcnt = maxcnt;

-- 
Alioth's /git/debian-med/git-commit-notice on /srv/git.debian.org/git/debian-med/htslib.git



More information about the debian-med-commit mailing list