[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